显示一个立方体的一点透视投影图;(用数组存放正方体的各顶点坐标)。

显示一个立方体的一点透视投影图;(用数组存放正方体的各顶点坐标)

基本步骤如下:
1.将三维物体平移到适当位置(l,m,n);
2.令视点在z轴,进行透视变换,变换矩阵如下:
显示一个立方体的一点透视投影图;(用数组存放正方体的各顶点坐标)。
3.最后,向xOy面作正投影变换,将结果变换到xOy面上。如此构造的一点透视变换矩阵为:
显示一个立方体的一点透视投影图;(用数组存放正方体的各顶点坐标)。
则三维形体中任意一点(x,y,z)的一点透视变换的齐次坐标计算形式为:
[x’,y’,z’,1]=
显示一个立方体的一点透视投影图;(用数组存放正方体的各顶点坐标)。
代码如下:

#include<graphics.h>
#include<stdio.h>

float l,m,n,d;

//一点透视
//参考参数为l=80,m=160,n=200,d=250
void onetoushi(float *p){
	float x,y,z,k;
	int a[10],b[10];
	int i,N=5;
	for(i=0;i<24;i=i+3){
		x=p[i];y=p[i+1];z=p[i+2];
		k=(d+n+z)/d;
		p[i]=(x+l)/k;
		p[i+1]=(y+m)/k;
		p[i+2]=0;
	}
	float q1[10]={p[0],p[1],p[3],p[4],p[15],p[16],p[12],p[13],p[0],p[1]};
	float q2[10]={p[6],p[7],p[9],p[10],p[21],p[22],p[18],p[19],p[6],p[7]};
	for(i=0;i<10;i++){
		a[i]=(int)q1[i];
	    b[i]=(int)q2[i];
	}
	drawpoly(5,a);
	drawpoly(5,b);
	line(a[0],a[1],b[2],b[3]);
	line(a[2],a[3],b[0],b[1]);
	line(a[4],a[5],b[6],b[7]);
	line(a[6],a[7],b[4],b[5]);
}

//主函数
int main(){
	int gd=DETECT,gmode;
	float p[24]={0,0,0,100,0,0,100,100,0,0,100,0,0,0,100,100,0,100,100,100,100,0,100,100};
	printf("请输入平移的位置:\n");
	printf("l= ");
	scanf("%f",&l);
	printf("m= ");
	scanf("%f",&m);
	printf("n= ");
	scanf("%f",&n);
	printf("输入投影中心在z的位置:\n");
	printf("d= ");
	scanf("%f",&d);
	initgraph(&gd,&gmode,"");
	onetoushi(p);
	getchar();
	getchar();
	closegraph();
	return 0;
}

运行输入参数:
显示一个立方体的一点透视投影图;(用数组存放正方体的各顶点坐标)。
显示结果为:
显示一个立方体的一点透视投影图;(用数组存放正方体的各顶点坐标)。