显示一个立方体的一点透视投影图;(用数组存放正方体的各顶点坐标)。
显示一个立方体的一点透视投影图;(用数组存放正方体的各顶点坐标)
基本步骤如下:
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;
}
运行输入参数:
显示结果为: