如何显示一个立方体的两点透视投影图(用数组存放正方体的各顶点坐标)?
#include<graphics.h>
#include<stdio.h>
#include<math.h>
float l,m,n,d,t,g1,g2,g3;
//两点透视
//P为经过两点透视后的立方体坐标,q则是使画图显示出来,而对p进行的倍率扩大,x扩大100,y扩大-100
//图像所选取数据参数为书上案例一致,l=n=0,m=-1.4,p=-0.1,q=0,r=-0.45,角度30
void twotoushi(float *p){
int i,q[32],j=0;
float a,b,c,d;
for(i=0;i<32;i=i+4){
a=p[i];b=p[i+1];c=p[i+2];d=p[i+3];
p[i]=a*cos(t)+c*sin(t)+d*(l*cos(t)+n*sin(t));
p[i+1]=b+d*m;
p[i+2]=0;
p[i+3]=a*(g1*cos(t)-g3*sin(t))+c*(g1*sin(t)+g3*cos(t))+d*(g1*(l*cos(t)+n*sin(t))+g3*(n*cos(t)-l*sin(t))+1);
p[i]=p[i]/p[i+3];
p[i+1]=p[i+1]/p[i+3];
p[i+3]=1;
}
for(i=0;i<32;i=i+4){
q[j++]=(int)(p[i]*100);
q[j++]=(int)(p[i+1]*-100);
}
//printf("两点透视后的各点坐标:\n");
//for(i=0;i<32;i=i+4)
//printf("%5.2f%5.2f\n",p[i],p[i+1]);
//printf("比例扩大之后的坐标:\n");
//for(i=0;i<16;i=i+2)
//printf("%5d%5d\n",q[i],q[i+1]);
int s1[10]={q[0],q[1],q[2],q[3],q[10],q[11],q[8],q[9],q[0],q[1]};
int s2[10]={q[4],q[5],q[6],q[7],q[14],q[15],q[12],q[13],q[4],q[5]};
drawpoly(5,s1);
drawpoly(5,s2);
line(q[0],q[1],q[6],q[7]);
line(q[2],q[3],q[4],q[5]);
line(q[8],q[9],q[14],q[15]);
line(q[10],q[11],q[12],q[13]);
}
//主函数(因为画图原因,立方体位单位立方体,参数和书本上一致,为了使画图精准,在画图时将结果的x值扩大100倍,y值扩大-100倍率,但所使用方法正确)
int main(){
int gd=DETECT,gmode;
double pi=3.1415926;
float p[32]={0,0,0,1,1,0,0,1,1,1,0,1,0,1,0,1,0,0,1,1,1,0,1,1,1,1,1,1,0,1,1,1};
printf("请输入平移的位置:\n");
printf("l= ");
scanf("%f",&l);
printf("m= ");
scanf("%f",&m);
printf("n= ");
scanf("%f",&n);
printf("输入旋转角度:\n");
scanf("%f",&t);
t=t*pi/180;
printf("输入投影透视变换参数:\n");
printf("p= ");
scanf("%f",&g1);
printf("q= ");
scanf("%f",&g2);
printf("r= ");
scanf("%f",&g3);
initgraph(&gd,&gmode,"");
twotoushi(p);
getchar();
getchar();
closegraph();
return 0;
}
运行后的立方体各点坐标:
输入远行参数条件:
运行后立方体的图案: