打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
计算机图形学三维正轴测投影变换算法

一.  三维正轴测投影变换算法

1.        模块设计

main主函数

   功能:

a)        提供Tx4x4变换矩阵各元素数据。

b)       初始化图形环境。

c)        调用用户函数matrix()。

d)       等待图形显示。

e)        恢复屏幕显示状态。

 

matrix()用户函数:

功能:

a)        完成点集齐次坐标矩阵与变换矩阵的乘法运算。

b)       调用用户函数draw()。

 

draw()用户函数:

功能:根据三维组合体的拓扑关系和正交变换后的齐次坐标,进行屏幕绘图。

 

2.        模块结构图

                 模块结构设计如图3所示。

  matrix

  main

 

 

 

 

 

 

 

 

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]]);

  }

}

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
回文诗100首
卡尔曼算法笔记
从开方算法看数学和计算机思维的差异(二)——计算机人怎么想问题
R语言Metropolis Hastings采样和贝叶斯泊松回归Poisson模型
TensorFlow学习(四):优化器Optimizer
PID控制器开发笔记之二:积分分离PID控制器的实现
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服