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

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

#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;
}

运行后的立方体各点坐标:
在这里插入图片描述
输入远行参数条件:
在这里插入图片描述
运行后立方体的图案:
在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值