一. 三维正轴测投影变换算法
1. 模块设计
main主函数
功能:
a) 提供Tx4x4变换矩阵各元素数据。
b) 初始化图形环境。
c) 调用用户函数matrix()。
d) 等待图形显示。
e) 恢复屏幕显示状态。
matrix()用户函数:
功能:
a) 完成点集齐次坐标矩阵与变换矩阵的乘法运算。
b) 调用用户函数draw()。
draw()用户函数:
功能:根据三维组合体的拓扑关系和正交变换后的齐次坐标,进行屏幕绘图。
2. 模块结构图
模块结构设计如图3所示。
draw
图2模块结构图
3. 数据设计
顶点的齐次坐标矩阵:用外部二维数组进行定义:float p[N][4]
顶点数:符号常量N。可根据图形具体情况确定其值。
走笔顺序和动作:用外部二维数组进行定义:int tp[]
走笔结束控制:由编码整数-100标识。
4. 程序代码设计
#include <math.h>
#include <graphics.h>
#include <conio.h>
void draw(float z[][4],float xt0,float yt0,float ts0);
void matrix(float t[][4]);
#define N 18
float p[N][4]={{0,0,0,1},{0,40,0,1},{45,40,0,1},{45,0,0,1},
{45,0,8,1},{45,40,8,1},{8,40,8,1},{8,0,8,1},
{8,0,28,1},{8,40,28,1},{0,40,28,1},{0,0,28,1},
{40,24,8,1},{8,24,8,1},{8,24,24,1},{8,16,24,1},
{8,16,8,1},{40,16,8,1}
};
inttp[]={-1,0,1,2,3,0,5,6,1,-1,3,4,5,6,7,2,-1,4,7,-1,10,11,12,
13,14,15,10,-1,17,18,21,22,23,16,17,-1,10,17,-1,11,18,-1,
12,21,-1,13,22,-1,14,23,-1,15,16,-100};
main()
{
static float tx[4][4];
float beta,cita;
int driver,mode;
driver=DETECT;
initgraph(&driver,&mode,"");
settextstyle(1,0,4);
setcolor(BROWN);
outtextxy(140,20,"3D graphic matrixconvert");
printf("input==>β, θ:"); /*β和θ的输入法分别为:Alt+225, Alt+233*/
scanf("%f,%f",&beta,&cita);
beta=beta*3.14159/180.0;
cita=cita*3.14159/180.0;
tx[0][0]=cos(beta);tx[0][2]=-sin(beta)*sin(cita);
tx[1][0]=-sin(beta);
tx[1][2]=-cos(beta)*sin(cita);tx[2][2]=cos(cita);
tx[3][3]=1;
setcolor(CYAN);
matrix(tx[0]);
getch();
closegraph();
}
void matrix(float t[][4])
{
float z[N][4],xt0,yt0,ts0;
int i,j,k;
for(i=0;i<N;i++)
for(j=0;j<4;j++)
{
z[i][j]=0;
for(k=0;k<4;k++)
z[i][j]=z[i][j]+p[i][k]*t[k][j];
}
draw(z[0],300,200,4);
}
void draw(float z[][4],float xt0,float yt0,float ts0)
{
float x[N],y[N];
int i;
for(i=0;i<N;i++)
{
x[i]=xt0-z[i][0]*ts0;
y[i]=yt0-z[i][2]*ts0;
}
for(i=0;i<1000;i++)
{
if(tp[i]==-100) break;
if(tp[i]==-1)
{
i++;
moveto(x[tp[i]],y[tp[i]]);
}
if(tp[i]>=0)
lineto(x[tp[i]],y[tp[i]]);
}
}