这个纯粹在为了作业而写的,或许因为我的方向不在计算机图形学方面吧,因此对这门学科没有深入的研究,希望不会遗笑大方!用C语言实现对三维图形的投影变换,在屏幕上打印出立体图形的三视图与轴测图
#include"math.h"
#include "graphics.h"
int num[12][2]={{0,1},{1,2},{2,3},{3,4},{4,5},{5,6},{6,7},{0,5},{1,6},{2,7},{7,4},{3,0}};
float pp[8][2];
float t[4][4];
float xx,yy;
int p[8][4]={{12,15,25,1},{0,15,25,1},{0,15,0,1},{35,15,0,1},{35,0,0,1},{12,0,25,1},{0,0,25,1},{0,0,0,1}};
float xs,ys,xe,ye;
int i,a;
main() /*函数入口,由这里开始*/
{
int gd=DETECT,gm;
initgraph(&gd,&gm,"");
setcolor(3);
left();
bottom();
right();
zc();
zc2();
getch();
closegraph();
}
left() /*调用主视图变换矩阵,画主视图子程序*/
{
left1();
for(i=0;i<8;i++)
{
pp[0]=affincx(p[0],p[1],p[2]);
pp[1]=affincz(p[0],p[1],p[2]);
}
drawline(200,120);
}
bottom() /*调用俯视图变换矩阵,画俯视图子程序*/
{
bottom1();
for(i=0;i<8;i++)
{
pp[0]=affincx(p[0],p[1],p[2]);
pp[1]=affincz(p[0],p[1],p[2]);
}
drawline(200,200);
}
right() /*调用右视图变换矩阵,画右视图子程序*/
{
right1();
for(i=0;i<8;i++)
{
pp[0]=affincx(p[0],p[1],p[2]);
pp[1]=affincz(p[0],p[1],p[2]);
}
drawline(300,120);
}
zc() /*调用轴测图变换矩阵,画轴测图子程序*/
{
zc1();
for(i=0;i<8;i++)
{
pp[0]=affincx(p[0],p[1],p[2]);
pp[1]=affincz(p[0],p[1],p[2]);
}
drawline(350,230);
}
zc2() /*调用绕Z轴变换的轴测图矩阵,画绕Z轴旋转轴测图子程序*/
{
for(a=0;a<=360;a+=120)
{
zc11();
for(i=0;i<8;i++)
{
pp[0]=affincx(p[0],p[1],p[2]);
pp[1]=affincz(p[0],p[1],p[2]);
}
setcolor(GREEN);
drawline(480,380);
}
}
left1() /*主视图矩阵*/
{
t[0][0]=1;t[0][1]=0;t[0][2]=0;t[0][3]=0;
t[1][0]=0;t[1][1]=0;t[1][2]=0;t[1][3]=0;
t[2][0]=0;t[2][1]=0;t[2][2]=1;t[2][3]=0;
t[3][0]=0;t[3][1]=0;t[3][2]=0;t[3][3]=1;
}
bottom1() /*俯视图矩阵*/
{
t[0][0]=1;t[0][1]=0;t[0][2]=0;t[0][3]=0;
t[1][0]=0;t[1][1]=0;t[1][2]=-1;t[1][3]=0;
t[2][0]=0;t[2][1]=0;t[2][2]=0;t[2][3]=0;
t[3][0]=0;t[3][1]=0;t[3][2]=-20;t[3][3]=1;
}
right1() /*右视图矩阵*/
{
t[0][0]=0;t[0][1]=0;t[0][2]=0;t[0][3]=0;
t[1][0]=-1;t[1][1]=0;t[1][2]=0;t[1][3]=0;
t[2][0]=0;t[2][1]=0;t[2][2]=1;t[2][3]=0;
t[3][0]=-20;t[3][1]=0;t[3][2]=0;t[3][3]=1;
}
zc1() /*轴测图矩阵*/
{
double t1,t2;
t1=30.0*3.1415927/180;t2=45.0*3.1415927/180;
t[0][0]=cos(t1);t[0][1]=0.0;t[0][2]=-sin(t1)*sin(t2);t[0][3]=0.0;