分享

计算机图形学三维变换、三维观察与消隐算法的实现

 x小登 2016-11-12

原创作品,出自 “晓风残月xj” 博客,欢迎转载,转载时请务必注明出处(http://blog.csdn.net/xiaofengcanyuexj)。

由于各种原因,可能存在诸多不足,欢迎斧正!

由于报告遗失,在此只发代码,望见谅!

  1. //立方体透视图—一点透视改进版.cpp  
  2.   
  3. #include<gl/glut.h>  
  4. #include<windows.h>  
  5. #include<iostream>  
  6. #include<algorithm>  
  7. #include<cmath>  
  8. using namespace std;  
  9.   
  10. const int MAXN=200;  
  11. int winWidth=1000,winHeight=600;//窗口宽高  
  12. int MyPointNum=0;  //用户图形的顶点数  
  13. double PI=acos(-1.0);//获取PI值  
  14. double Matrix[4][4]={{1,0,0,0},{0,1,0,0},{0,0,1,0},{500,300,300,1}};//初始化为单位矩阵  
  15. double dd=-500,nn=-400,mm=-320,ll=160;  
  16. double T1[4][4]={{1,0,0,0},{0,1,0,0},{0,0,0,1/dd},{ll,mm,0,1+nn/dd}};//正等测图  
  17. struct point  
  18. {  
  19.     double x,y,z,tag;  
  20. }MyPoint[MAXN],TPoint[MAXN];//定义图形的顶点  
  21.   
  22. /************************************************** 
  23. *参数:无参数 
  24. *功能:重置单位矩阵 
  25. ***************************************************/  
  26. void T1Init()  
  27. {  
  28.     T1[0][0]=1;    T1[0][1]=0;   T1[0][2]=0;     T1[0][3]=0;  
  29.     T1[1][0]=0;    T1[1][1]=1;   T1[1][2]=0;     T1[1][3]=0;  
  30.     T1[2][0]=0;    T1[2][1]=0;   T1[2][2]=0;     T1[2][3]=1/dd;  
  31.     T1[3][0]=ll;   T1[3][1]=mm;  T1[3][2]=0;     T1[3][3]=1+nn/dd;  
  32. }  
  33.   
  34. /************************************************** 
  35. *参数:无参数 
  36. *功能:初始化自定义图形 
  37. ***************************************************/  
  38. void MyPologyInit()  
  39. {  
  40.     MyPointNum=8;  
  41.     MyPoint[0].x=0,    MyPoint[0].y=0,   MyPoint[0].z=0,    MyPoint[0].tag=1;  
  42.     MyPoint[1].x=200,  MyPoint[1].y=0,   MyPoint[1].z=0,    MyPoint[1].tag=1;  
  43.     MyPoint[2].x=200,  MyPoint[2].y=200, MyPoint[2].z=0,    MyPoint[2].tag=1;  
  44.     MyPoint[3].x=0,    MyPoint[3].y=200, MyPoint[3].z=0,    MyPoint[3].tag=1;  
  45.   
  46.     MyPoint[4].x=0,    MyPoint[4].y=0,   MyPoint[4].z=200,  MyPoint[4].tag=1;  
  47.     MyPoint[5].x=200,  MyPoint[5].y=0,   MyPoint[5].z=200,  MyPoint[5].tag=1;  
  48.     MyPoint[6].x=200,  MyPoint[6].y=200, MyPoint[6].z=200,  MyPoint[6].tag=1;  
  49.     MyPoint[7].x=0,    MyPoint[7].y=200, MyPoint[7].z=200,  MyPoint[7].tag=1;  
  50. }  
  51.   
  52. /************************************************** 
  53. *参数:无参数 
  54. *功能:获得变换后的用户图形的顶点 
  55. ***************************************************/  
  56. void MyTrans(point NewPoint[],point OldPoint[],double Tran[4][4])  
  57. {  
  58.     for(int i=0;i<MyPointNum;i++)  
  59.     {  
  60.         double tx=OldPoint[i].x,ty=OldPoint[i].y,tz=OldPoint[i].z,ttag=OldPoint[i].tag;  
  61.         NewPoint[i].x=tx*Tran[0][0]+ty*Tran[1][0]+tz*Tran[2][0]+ttag*Tran[3][0];  
  62.         NewPoint[i].y=tx*Tran[0][1]+ty*Tran[1][1]+tz*Tran[2][1]+ttag*Tran[3][1];  
  63.         NewPoint[i].z=tx*Tran[0][2]+ty*Tran[1][2]+tz*Tran[2][2]+ttag*Tran[3][2];  
  64.         NewPoint[i].tag=tx*Tran[0][3]+ty*Tran[1][3]+tz*Tran[2][3]+ttag*Tran[3][3];  
  65.         if(NewPoint[i].tag!=0&&NewPoint[i].tag!=1)  
  66.         {  
  67.             NewPoint[i].x/=NewPoint[i].tag,NewPoint[i].y/=NewPoint[i].tag,NewPoint[i].z/=NewPoint[i].tag,NewPoint[i].tag=1;  
  68.         }  
  69.     }  
  70. }  
  71.   
  72. /************************************************** 
  73. *参数:w表示窗口宽,h表示窗口的高 
  74. *功能:重新指定窗口的宽高 
  75. ***************************************************/  
  76. void ChangeSize(int w, int h)  
  77. {     
  78.     winWidth=w;winHeight=h;  
  79.     glViewport(0,0,w,h);   
  80.     glMatrixMode(GL_PROJECTION);  
  81.     glLoadIdentity();  
  82.     gluOrtho2D(0.0,winWidth,0.0,winHeight);  
  83. }  
  84.   
  85. /************************************************** 
  86. *参数:需绘制图形的顶点 
  87. *功能:绘制指定的图形 
  88. ***************************************************/  
  89. void OnDraw(point TmpPoint[])  
  90. {  
  91.     glColor3f(0.0f,1.0f,0.0f);   
  92.     glBegin(GL_LINES);    
  93.     glVertex2d(TmpPoint[0].x,TmpPoint[0].y);  glVertex2d(TmpPoint[1].x,TmpPoint[1].y);    
  94.     glVertex2d(TmpPoint[0].x,TmpPoint[0].y);  glVertex2d(TmpPoint[3].x,TmpPoint[3].y);  
  95.     glVertex2d(TmpPoint[0].x,TmpPoint[0].y);  glVertex2d(TmpPoint[4].x,TmpPoint[4].y);  
  96.     glVertex2d(TmpPoint[1].x,TmpPoint[1].y);  glVertex2d(TmpPoint[0].x,TmpPoint[0].y);  
  97.     glVertex2d(TmpPoint[1].x,TmpPoint[1].y);  glVertex2d(TmpPoint[2].x,TmpPoint[2].y);  
  98.     glVertex2d(TmpPoint[1].x,TmpPoint[1].y);  glVertex2d(TmpPoint[5].x,TmpPoint[5].y);  
  99.     glVertex2d(TmpPoint[2].x,TmpPoint[2].y);  glVertex2d(TmpPoint[1].x,TmpPoint[1].y);  
  100.     glVertex2d(TmpPoint[2].x,TmpPoint[2].y);  glVertex2d(TmpPoint[3].x,TmpPoint[3].y);  
  101.     glVertex2d(TmpPoint[2].x,TmpPoint[2].y);  glVertex2d(TmpPoint[6].x,TmpPoint[6].y);  
  102.     glVertex2d(TmpPoint[3].x,TmpPoint[3].y);  glVertex2d(TmpPoint[0].x,TmpPoint[0].y);  
  103.     glVertex2d(TmpPoint[3].x,TmpPoint[3].y);  glVertex2d(TmpPoint[2].x,TmpPoint[2].y);  
  104.     glVertex2d(TmpPoint[3].x,TmpPoint[3].y);  glVertex2d(TmpPoint[7].x,TmpPoint[7].y);  
  105.     glVertex2d(TmpPoint[4].x,TmpPoint[4].y);  glVertex2d(TmpPoint[5].x,TmpPoint[5].y);  
  106.     glVertex2d(TmpPoint[5].x,TmpPoint[5].y);  glVertex2d(TmpPoint[6].x,TmpPoint[6].y);  
  107.     glVertex2d(TmpPoint[6].x,TmpPoint[6].y);  glVertex2d(TmpPoint[7].x,TmpPoint[7].y);  
  108.     glVertex2d(TmpPoint[7].x,TmpPoint[7].y);  glVertex2d(TmpPoint[4].x,TmpPoint[4].y);  
  109.     glEnd();  
  110.       
  111.     //求交点  
  112.     double x1_x0=TmpPoint[4].x-TmpPoint[0].x;  
  113.     double y1_y0=TmpPoint[4].y-TmpPoint[0].y;  
  114.     double x4_x3=TmpPoint[5].x-TmpPoint[1].x;  
  115.     double y4_y3=TmpPoint[5].y-TmpPoint[1].y;  
  116.     double cro_x=(y4_y3*x1_x0*TmpPoint[1].x+(TmpPoint[0].y-TmpPoint[1].y)*x4_x3*x1_x0-x4_x3*y1_y0*TmpPoint[0].x)/((x1_x0*y4_y3)-(x4_x3)*(y1_y0));  
  117.     double cro_y=y4_y3*(cro_x-TmpPoint[1].x)/x4_x3+TmpPoint[1].y;  
  118.   
  119.     glColor3f(1.0f,1.0f,1.0f);   
  120.     glBegin(GL_LINES);   
  121.     glVertex2d(TmpPoint[0].x,TmpPoint[0].y);   glVertex2d(cro_x,cro_y);  
  122.     glVertex2d(TmpPoint[1].x,TmpPoint[1].y);   glVertex2d(cro_x,cro_y);  
  123.     glVertex2d(TmpPoint[2].x,TmpPoint[2].y);   glVertex2d(cro_x,cro_y);  
  124.     glVertex2d(TmpPoint[3].x,TmpPoint[3].y);   glVertex2d(cro_x,cro_y);  
  125.     glEnd();  
  126. }  
  127.   
  128. /************************************************** 
  129. *参数:无参数 
  130. *功能:获得变换后的用户图形的顶点 
  131. ***************************************************/  
  132. void GetProcess()  
  133. {  
  134.     T1Init();  
  135.     MyTrans(TPoint,MyPoint,T1);  
  136.     MyTrans(TPoint,TPoint,Matrix);  
  137. }  
  138.   
  139. /************************************************** 
  140. *参数:无参数 
  141. *功能:绘制用户的图形 
  142. ***************************************************/  
  143. void Display()  
  144. {     
  145.     glClear(GL_COLOR_BUFFER_BIT);  
  146.     GetProcess();  
  147.     OnDraw(TPoint);  
  148.     glutSwapBuffers();  
  149. }  
  150.   
  151. /************************************************** 
  152. *参数:无参数 
  153. *功能:窗口的初始化 
  154. ***************************************************/  
  155. void MyInit()  
  156. {     
  157.     glClearColor(0.0f, 0.0f, 0.0f, 1.0f);  
  158.     MyPologyInit();  
  159.     dd=-500,nn=-400,mm=-320,ll=160;  
  160. }  
  161.   
  162. /************************************************** 
  163. *参数:按键类型等 
  164. *功能:改变视距 
  165. ***************************************************/  
  166. void SpecialKeys(int key,int x,int y)  
  167. {  
  168.     if(key==GLUT_KEY_UP)dd-=100;  
  169.     if(key==GLUT_KEY_DOWN)dd+=100;  
  170.     glutPostRedisplay();  
  171. }  
  172.   
  173. int main(int argc, char* argv[])  
  174. {  
  175.     glutInit(&argc,argv);  
  176.     glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);  
  177.     glutInitWindowSize(1000,600);   
  178.     glutInitWindowPosition(0,0);  
  179.     glutCreateWindow("我的三维图形透视图——一点透视演示程序");   
  180.     glutDisplayFunc(Display);   
  181.     glutReshapeFunc(ChangeSize);  
  182.     glutSpecialFunc(SpecialKeys);  
  183.     MyInit();                                      
  184.     glutMainLoop();                                 
  185.     return 0;  
  186. }  


  1. //三视图改进版.cpp  
  2.   
  3. #include<gl/glut.h>  
  4. #include<windows.h>  
  5. #include<iostream>  
  6. #include<algorithm>  
  7. #include<cmath>  
  8. #include<vector>  
  9. using namespace std;  
  10.   
  11. const int MAXN=200;  
  12. int winWidth=1000,winHeight=600;//窗口宽高  
  13. int MyPointNum=0;  //用户图形的顶点数  
  14. double PI=acos(-1.0);//获取PI值  
  15. double Matrix[4][4]={{1,0,0,0},{0,1,0,0},{0,0,1,0},{500,300,300,1}};//初始化为单位矩阵  
  16. double XOZ[4][4]={{1,0,0,0},{0,0,0,0},{0,0,1,0},{0,0,0,1}};//主视图  
  17. double XOY[4][4]={{1,0,0,0},{0,0,-1,0},{0,0,0,0},{0,0,-50,1}};//俯视图  
  18. double YOZ[4][4]={{0,0,0,0},{-1,0,0,0},{0,0,1,0},{-50,0,0,1}};//侧视图  
  19. struct point  
  20. {  
  21.     double x,y,z,tag;  
  22. }MyPoint[MAXN],XOZPoint[MAXN],XOYPoint[MAXN],YOZPoint[MAXN];//定义图形的顶点  
  23. vector<int>MyFace[10];  
  24. int MyFaceNum=6;  
  25.   
  26. /************************************************** 
  27. *参数:无参数 
  28. *功能:初始化自定义立方体 
  29. ***************************************************/  
  30. void MycubeInit()  
  31. {  
  32.     MyPointNum=8;  
  33.     MyPoint[0].x=0,MyPoint[0].y=0,MyPoint[0].z=0,MyPoint[0].tag=1;  
  34.     MyPoint[1].x=100,MyPoint[1].y=0,MyPoint[1].z=0,MyPoint[1].tag=1;  
  35.     MyPoint[2].x=100,MyPoint[2].y=200,MyPoint[2].z=0,MyPoint[2].tag=1;  
  36.     MyPoint[3].x=0,MyPoint[3].y=200,MyPoint[3].z=0,MyPoint[3].tag=1;  
  37.   
  38.     MyPoint[4].x=0,   MyPoint[4].y=0,   MyPoint[4].z=250,  MyPoint[4].tag=1;  
  39.     MyPoint[5].x=100, MyPoint[5].y=0,   MyPoint[5].z=250,  MyPoint[5].tag=1;  
  40.     MyPoint[6].x=100, MyPoint[6].y=200, MyPoint[6].z=250,  MyPoint[6].tag=1;  
  41.     MyPoint[7].x=0, MyPoint[7].y=200,   MyPoint[7].z=250,  MyPoint[7].tag=1;  
  42.   
  43.     MyFaceNum=6;  
  44.     MyFace[0].push_back(0);MyFace[0].push_back(1);MyFace[0].push_back(2);MyFace[0].push_back(3);  
  45.     MyFace[1].push_back(0);MyFace[1].push_back(1);MyFace[1].push_back(5);MyFace[1].push_back(4);  
  46.     MyFace[2].push_back(1);MyFace[2].push_back(2);MyFace[2].push_back(6);MyFace[2].push_back(5);  
  47.     MyFace[3].push_back(2);MyFace[3].push_back(3);MyFace[3].push_back(7);MyFace[3].push_back(6);  
  48.     MyFace[4].push_back(3);MyFace[4].push_back(0);MyFace[4].push_back(4);MyFace[4].push_back(7);  
  49.     MyFace[5].push_back(4);MyFace[5].push_back(5);MyFace[5].push_back(6);MyFace[5].push_back(7);  
  50. }  
  51.   
  52. /************************************************** 
  53. *参数:无参数 
  54. *功能:初始化自定义三棱柱 
  55. ***************************************************/  
  56. void MyTriangularPrismInit()  
  57. {  
  58.     MyPointNum=6;  
  59.     MyPoint[0].x=0,   MyPoint[0].y=0,   MyPoint[0].z=0,    MyPoint[0].tag=1;  
  60.     MyPoint[1].x=0,   MyPoint[1].y=200, MyPoint[1].z=0,    MyPoint[1].tag=1;  
  61.     MyPoint[2].x=0,   MyPoint[2].y=100, MyPoint[2].z=100,  MyPoint[2].tag=1;  
  62.   
  63.     MyPoint[3].x=300, MyPoint[3].y=0,   MyPoint[3].z=0,    MyPoint[3].tag=1;  
  64.     MyPoint[4].x=300, MyPoint[4].y=200, MyPoint[4].z=0,    MyPoint[4].tag=1;  
  65.     MyPoint[5].x=300, MyPoint[5].y=100, MyPoint[5].z=100,  MyPoint[5].tag=1;  
  66.       
  67.     MyFaceNum=5;  
  68.     MyFace[0].push_back(0);MyFace[0].push_back(1);MyFace[0].push_back(2);  
  69.     MyFace[1].push_back(0);MyFace[1].push_back(1);MyFace[1].push_back(4);MyFace[1].push_back(3);  
  70.     MyFace[3].push_back(1);MyFace[3].push_back(2);MyFace[3].push_back(5);MyFace[3].push_back(4);  
  71.     MyFace[4].push_back(2);MyFace[4].push_back(0);MyFace[4].push_back(3);MyFace[4].push_back(5);  
  72.     MyFace[5].push_back(3);MyFace[5].push_back(4);MyFace[5].push_back(5);  
  73. }  
  74.   
  75. /************************************************** 
  76. *参数:无参数 
  77. *功能:获得变换后的用户图形的顶点 
  78. ***************************************************/  
  79. void MyTrans(point NewPoint[],point OldPoint[],double Tran[4][4])  
  80. {  
  81.     for(int i=0;i<MyPointNum;i++)  
  82.     {  
  83.         double tx=OldPoint[i].x,ty=OldPoint[i].y,tz=OldPoint[i].z,ttag=OldPoint[i].tag;  
  84.         NewPoint[i].x=tx*Tran[0][0]+ty*Tran[1][0]+tz*Tran[2][0]+ttag*Tran[3][0];  
  85.         NewPoint[i].y=tx*Tran[0][1]+ty*Tran[1][1]+tz*Tran[2][1]+ttag*Tran[3][1];  
  86.         NewPoint[i].z=tx*Tran[0][2]+ty*Tran[1][2]+tz*Tran[2][2]+ttag*Tran[3][2];  
  87.         NewPoint[i].tag=tx*Tran[0][3]+ty*Tran[1][3]+tz*Tran[2][3]+ttag*Tran[3][3];  
  88.     }  
  89. }  
  90.   
  91. /************************************************** 
  92. *参数:w表示窗口宽,h表示窗口的高 
  93. *功能:重新指定窗口的宽高 
  94. ***************************************************/  
  95. void ChangeSize(int w, int h)  
  96. {     
  97.     winWidth=w;winHeight=h;  
  98.     glViewport(0,0,w,h);   
  99.     glMatrixMode(GL_PROJECTION);  
  100.     glLoadIdentity();  
  101.     gluOrtho2D(0.0,winWidth,0.0,winHeight);  
  102. }  
  103.   
  104. /************************************************** 
  105. *参数:需绘制图形的顶点 
  106. *功能:绘制指定的图形 
  107. ***************************************************/  
  108. void OnDraw(point TmpPoint[])  
  109. {  
  110.     glBegin(GL_LINES);    
  111.     for(int i=0;i<MyFaceNum;i++)  
  112.     {  
  113.         int size=MyFace[i].size();  
  114.         for(int j=0;j<size;j++)  
  115.         {  
  116.             glVertex2d(TmpPoint[MyFace[i][j]].x,TmpPoint[MyFace[i][j]].z);  glVertex2d(TmpPoint[MyFace[i][(j+1)%size]].x,TmpPoint[MyFace[i][(j+1)%size]].z);    
  117.         }  
  118.     }  
  119.     glEnd();  
  120. }  
  121.   
  122. /************************************************** 
  123. *参数:无参数 
  124. *功能:绘制三视图的坐标系 
  125. ***************************************************/  
  126. void OnCoordinate()  
  127. {  
  128.     glColor3f(1.0f,1.0f,1.0f);   
  129.     glBegin(GL_LINES);  
  130.   
  131.     glVertex2d(winWidth/2,0);  glVertex2d(winWidth/2,winHeight);    
  132.     glVertex2d(0,winHeight/2);  glVertex2d(winWidth,winHeight/2);    
  133.   
  134.     //标记Z轴  
  135.     glVertex2d(winWidth/2+5,winHeight-15);  glVertex2d(winWidth/2+15,winHeight-15);  
  136.     glVertex2d(winWidth/2+5,winHeight-25);  glVertex2d(winWidth/2+15,winHeight-15);  
  137.     glVertex2d(winWidth/2+5,winHeight-25);  glVertex2d(winWidth/2+15,winHeight-25);  
  138.   
  139.     glVertex2d(winWidth/2-5,winHeight-5);  glVertex2d(winWidth/2,winHeight);  
  140.     glVertex2d(winWidth/2+5,winHeight-5);  glVertex2d(winWidth/2,winHeight);  
  141.   
  142.     //标记Y轴  
  143.     glVertex2d(winWidth/2+25,0+15);  glVertex2d(winWidth/2+20,0+10);  
  144.     glVertex2d(winWidth/2+15,0+15);  glVertex2d(winWidth/2+20,0+10);  
  145.     glVertex2d(winWidth/2+20,0+10);  glVertex2d(winWidth/2+20,0+5);  
  146.   
  147.     glVertex2d(winWidth/2-5,0+5);  glVertex2d(winWidth/2,0);  
  148.     glVertex2d(winWidth/2+5,0+5);  glVertex2d(winWidth/2,0);  
  149.   
  150.     //标记Y轴  
  151.     glVertex2d(0+25,winHeight/2+15);  glVertex2d(0+20,winHeight/2+10);  
  152.     glVertex2d(0+15,winHeight/2+15);  glVertex2d(0+20,winHeight/2+10);  
  153.     glVertex2d(0+20,winHeight/2+10);  glVertex2d(0+20,winHeight/2+5);  
  154.   
  155.     glVertex2d(0+5,winHeight/2+5);  glVertex2d(0,winHeight/2);  
  156.     glVertex2d(0+5,winHeight/2-5);  glVertex2d(0,winHeight/2);  
  157.   
  158.     //标记X轴  
  159.     glVertex2d(winWidth-25,winHeight/2+15);  glVertex2d(winWidth-15,winHeight/2+5);  
  160.     glVertex2d(winWidth-25,winHeight/2+5);  glVertex2d(winWidth-15,winHeight/2+15);  
  161.   
  162.     glVertex2d(winWidth-5,winHeight/2-5);  glVertex2d(winWidth,winHeight/2);  
  163.     glVertex2d(winWidth-5,winHeight/2+5);  glVertex2d(winWidth,winHeight/2);  
  164.   
  165.     glEnd();  
  166. }  
  167.   
  168. /************************************************** 
  169. *参数:无参数 
  170. *功能:绘制用户的图形 
  171. ***************************************************/  
  172. void Display()  
  173. {     
  174.     glClear(GL_COLOR_BUFFER_BIT);  
  175.     OnCoordinate();  
  176.     glColor3f(1.0f,1.0f,1.0f);   
  177.     glBegin(GL_LINES);  
  178.     glVertex2d(winWidth/2,0);  glVertex2d(winWidth/2,winHeight);    
  179.     glVertex2d(0,winHeight/2);  glVertex2d(winWidth,winHeight/2);    
  180.     glEnd();  
  181.   
  182.     glColor3f(1.0f,0.0f,0.0f);   
  183.     OnDraw(XOZPoint);  
  184.     glColor3f(0.0f,1.0f,0.0f);   
  185.     OnDraw(XOYPoint);  
  186.     glColor3f(0.0f,0.0f,1.0f);   
  187.     OnDraw(YOZPoint);  
  188.     glutSwapBuffers();  
  189. }  
  190.   
  191. /************************************************** 
  192. *参数:无参数 
  193. *功能:三维图形变换主函数 
  194. ***************************************************/  
  195. void GetThreeview()  
  196. {  
  197.     MyTrans(XOZPoint,MyPoint,XOZ);  
  198.     MyTrans(XOYPoint,MyPoint,XOY);  
  199.     MyTrans(YOZPoint,MyPoint,YOZ);  
  200.     MyTrans(XOZPoint,XOZPoint,Matrix);  
  201.     MyTrans(XOYPoint,XOYPoint,Matrix);  
  202.     MyTrans(YOZPoint,YOZPoint,Matrix);  
  203. }  
  204.   
  205. /************************************************** 
  206. *参数:无参数 
  207. *功能:窗口的初始化 
  208. ***************************************************/  
  209. void MyInit()  
  210. {     
  211.     for(int i=0;i<10;i++)  
  212.         MyFace[i].clear();  
  213.     glClearColor(0.0f, 0.0f, 0.0f, 1.0f);  
  214.     MycubeInit();  
  215.     GetThreeview();  
  216. }  
  217.   
  218. /************************************************** 
  219. *参数:菜单选项 
  220. *功能:菜单响应函数 
  221. ***************************************************/  
  222. void MyMenuProcess(int value)  
  223. {  
  224.     for(int i=0;i<10;i++)  
  225.         MyFace[i].clear();  
  226.     if(1==value)  
  227.         MycubeInit();  
  228.     if(2==value)  
  229.         MyTriangularPrismInit();  
  230.     GetThreeview();  
  231.     glutPostRedisplay();  
  232. }  
  233.   
  234. int main(int argc, char* argv[])  
  235. {  
  236.     glutInit(&argc,argv);  
  237.     glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);  
  238.     glutInitWindowSize(1000,600);   
  239.     glutInitWindowPosition(0,0);  
  240.     glutCreateWindow("我的三维图形三视图演示程序");   
  241.     glutDisplayFunc(Display);   
  242.     glutReshapeFunc(ChangeSize);  
  243.     glutCreateMenu(MyMenuProcess);  
  244.     glutAddMenuEntry("立方体三视图",1);  
  245.     glutAddMenuEntry("三棱柱三视图",2);  
  246.     glutAttachMenu(GLUT_RIGHT_BUTTON);  
  247.     MyInit();                                      
  248.     glutMainLoop();                                 
  249.     return 0;  
  250. }  

  1. //正轴测图改进版.cpp  
  2.   
  3. #include<gl/glut.h>  
  4. #include<windows.h>  
  5. #include<iostream>  
  6. #include<algorithm>  
  7. #include<cmath>  
  8. #include<vector>  
  9. using namespace std;  
  10.   
  11. const int MAXN=200;  
  12. int winWidth=1000,winHeight=600;//窗口宽高  
  13. int MyPointNum=0;  //用户图形的顶点数  
  14. double Matrix[4][4]={{1,0,0,0},{0,1,0,0},{0,0,1,0},{500,300,300,1}};//初始化为单位矩阵  
  15. double PI=acos(-1.0);  
  16. double anga=PI/4,angb=PI/4;  
  17. double Change[4][4]={{0.7071,-0.4082,0,0},{0,0.8165,0,0},{-0.7071,-0.4082,0,0},{0,0,0,1}};//正等测图  
  18. struct point  
  19. {  
  20.     double x,y,z,tag;  
  21. }MyPoint[MAXN],TPoint[MAXN],Axis[3];//定义图形的顶点  
  22. vector<int>MyFace[10];  
  23. int MyFaceNum=6;  
  24.   
  25. /************************************************** 
  26. *参数:无参数 
  27. *功能:初始化自定义立方体 
  28. ***************************************************/  
  29. void MycubeInit()  
  30. {  
  31.     MyPointNum=8;  
  32.     MyPoint[0].x=0,MyPoint[0].y=0,MyPoint[0].z=0,MyPoint[0].tag=1;  
  33.     MyPoint[1].x=100,MyPoint[1].y=0,MyPoint[1].z=0,MyPoint[1].tag=1;  
  34.     MyPoint[2].x=100,MyPoint[2].y=100,MyPoint[2].z=0,MyPoint[2].tag=1;  
  35.     MyPoint[3].x=0,MyPoint[3].y=100,MyPoint[3].z=0,MyPoint[3].tag=1;  
  36.   
  37.     MyPoint[4].x=0,   MyPoint[4].y=0,   MyPoint[4].z=250,  MyPoint[4].tag=1;  
  38.     MyPoint[5].x=100, MyPoint[5].y=0,   MyPoint[5].z=250,  MyPoint[5].tag=1;  
  39.     MyPoint[6].x=100, MyPoint[6].y=100, MyPoint[6].z=250,  MyPoint[6].tag=1;  
  40.     MyPoint[7].x=0, MyPoint[7].y=100,   MyPoint[7].z=250,  MyPoint[7].tag=1;  
  41.   
  42.     MyFaceNum=6;  
  43.     MyFace[0].push_back(0);MyFace[0].push_back(1);MyFace[0].push_back(2);MyFace[0].push_back(3);  
  44.     MyFace[1].push_back(0);MyFace[1].push_back(1);MyFace[1].push_back(5);MyFace[1].push_back(4);  
  45.     MyFace[2].push_back(1);MyFace[2].push_back(2);MyFace[2].push_back(6);MyFace[2].push_back(5);  
  46.     MyFace[3].push_back(2);MyFace[3].push_back(3);MyFace[3].push_back(7);MyFace[3].push_back(6);  
  47.     MyFace[4].push_back(3);MyFace[4].push_back(0);MyFace[4].push_back(4);MyFace[4].push_back(7);  
  48.     MyFace[5].push_back(4);MyFace[5].push_back(5);MyFace[5].push_back(6);MyFace[5].push_back(7);  
  49.   
  50.     Axis[0].x=200,Axis[0].y=0,Axis[0].z=0; Axis[0].tag=1;  
  51.     Axis[1].x=0,Axis[1].y=200,Axis[1].z=0; Axis[1].tag=1;  
  52.     Axis[2].x=0,Axis[2].y=0,Axis[2].z=300; Axis[2].tag=1;  
  53. }  
  54.   
  55. /************************************************** 
  56. *参数:无参数 
  57. *功能:初始化自定义三棱柱 
  58. ***************************************************/  
  59. void MyTriangularPrismInit()  
  60. {  
  61.     MyPointNum=6;  
  62.     MyPoint[0].x=0,   MyPoint[0].y=0,   MyPoint[0].z=0,    MyPoint[0].tag=1;  
  63.     MyPoint[1].x=0,   MyPoint[1].y=200, MyPoint[1].z=0,    MyPoint[1].tag=1;  
  64.     MyPoint[2].x=0,   MyPoint[2].y=100, MyPoint[2].z=100,  MyPoint[2].tag=1;  
  65.   
  66.     MyPoint[3].x=300, MyPoint[3].y=0,   MyPoint[3].z=0,    MyPoint[3].tag=1;  
  67.     MyPoint[4].x=300, MyPoint[4].y=200, MyPoint[4].z=0,    MyPoint[4].tag=1;  
  68.     MyPoint[5].x=300, MyPoint[5].y=100, MyPoint[5].z=100,  MyPoint[5].tag=1;  
  69.       
  70.     MyFaceNum=5;  
  71.     MyFace[0].push_back(0);MyFace[0].push_back(1);MyFace[0].push_back(2);  
  72.     MyFace[1].push_back(0);MyFace[1].push_back(1);MyFace[1].push_back(4);MyFace[1].push_back(3);  
  73.     MyFace[3].push_back(1);MyFace[3].push_back(2);MyFace[3].push_back(5);MyFace[3].push_back(4);  
  74.     MyFace[4].push_back(2);MyFace[4].push_back(0);MyFace[4].push_back(3);MyFace[4].push_back(5);  
  75.     MyFace[5].push_back(3);MyFace[5].push_back(4);MyFace[5].push_back(5);  
  76.   
  77.     Axis[0].x=400,Axis[0].y=0,Axis[0].z=0; Axis[0].tag=1;  
  78.     Axis[1].x=0,Axis[1].y=300,Axis[1].z=0; Axis[1].tag=1;  
  79.     Axis[2].x=0,Axis[2].y=0,Axis[2].z=200; Axis[2].tag=1;  
  80. }  
  81.   
  82. /************************************************** 
  83. *参数:无参数 
  84. *功能:获得变换后的用户图形的顶点 
  85. ***************************************************/  
  86. void MyTrans(point NewPoint[],point OldPoint[],double Tran[4][4])  
  87. {  
  88.     double tx,ty,tz,ttag;  
  89.     int i;  
  90.     for(i=0;i<MyPointNum;i++)  
  91.     {  
  92.         tx=OldPoint[i].x,ty=OldPoint[i].y,tz=OldPoint[i].z,ttag=OldPoint[i].tag;  
  93.         NewPoint[i].x=tx*Tran[0][0]+ty*Tran[1][0]+tz*Tran[2][0]+ttag*Tran[3][0];  
  94.         NewPoint[i].y=tx*Tran[0][1]+ty*Tran[1][1]+tz*Tran[2][1]+ttag*Tran[3][1];  
  95.         NewPoint[i].z=tx*Tran[0][2]+ty*Tran[1][2]+tz*Tran[2][2]+ttag*Tran[3][2];  
  96.         NewPoint[i].tag=tx*Tran[0][3]+ty*Tran[1][3]+tz*Tran[2][3]+ttag*Tran[3][3];  
  97.     }  
  98.     for(i=0;i<3;i++)  
  99.     {  
  100.         tx=Axis[i].x,ty=Axis[i].y,tz=Axis[i].z,ttag=Axis[i].tag;  
  101.         Axis[i].x=tx*Tran[0][0]+ty*Tran[1][0]+tz*Tran[2][0]+ttag*Tran[3][0];  
  102.         Axis[i].y=tx*Tran[0][1]+ty*Tran[1][1]+tz*Tran[2][1]+ttag*Tran[3][1];  
  103.         Axis[i].z=tx*Tran[0][2]+ty*Tran[1][2]+tz*Tran[2][2]+ttag*Tran[3][2];  
  104.         Axis[i].tag=tx*Tran[0][3]+ty*Tran[1][3]+tz*Tran[2][3]+ttag*Tran[3][3];  
  105.     }  
  106. }  
  107.   
  108. /************************************************** 
  109. *参数:w表示窗口宽,h表示窗口的高 
  110. *功能:重新指定窗口的宽高 
  111. ***************************************************/  
  112. void ChangeSize(int w, int h)  
  113. {     
  114.     winWidth=w;winHeight=h;  
  115.     glViewport(0,0,w,h);   
  116.     glMatrixMode(GL_PROJECTION);  
  117.     glLoadIdentity();  
  118.     gluOrtho2D(0.0,winWidth,0.0,winHeight);  
  119. }  
  120.   
  121. /************************************************** 
  122. *参数:需绘制图形的顶点 
  123. *功能:绘制变换后的图形 
  124. ***************************************************/  
  125. void OnDraw(point TmpPoint[])  
  126. {  
  127.     glColor3f(0.0f,1.0f,0.0f);   
  128.     glBegin(GL_LINES);    
  129.     for(int i=0;i<MyFaceNum;i++)  
  130.     {  
  131.         int size=MyFace[i].size();  
  132.         for(int j=0;j<size;j++)  
  133.         {  
  134.             glVertex2d(TmpPoint[MyFace[i][j]].x,TmpPoint[MyFace[i][j]].y);  glVertex2d(TmpPoint[MyFace[i][(j+1)%size]].x,TmpPoint[MyFace[i][(j+1)%size]].y);    
  135.         }  
  136.     }  
  137.     glEnd();  
  138. }  
  139.   
  140. /************************************************** 
  141. *参数:无参数 
  142. *功能:绘制三视图的坐标系 
  143. ***************************************************/  
  144. void OnCoordinate(point TmpPoint[])  
  145. {  
  146.     glColor3f(1.0f,1.0f,1.0f);   
  147.     glBegin(GL_LINES);  
  148.     glVertex2d(500,300);  glVertex2d(Axis[2].x,Axis[2].y);  //Z轴  
  149.     glVertex2d(Axis[2].x+5,Axis[2].y-15);  glVertex2d(Axis[2].x+15,Axis[2].y-15);  
  150.     glVertex2d(Axis[2].x+5,Axis[2].y-25);  glVertex2d(Axis[2].x+15,Axis[2].y-15);  
  151.     glVertex2d(Axis[2].x+5,Axis[2].y-25);  glVertex2d(Axis[2].x+15,Axis[2].y-25);  
  152.     glVertex2d(Axis[2].x-5,Axis[2].y-5);   glVertex2d(Axis[2].x,Axis[2].y);  
  153.     glVertex2d(Axis[2].x+5,Axis[2].y-5);   glVertex2d(Axis[2].x,Axis[2].y);  
  154.     glVertex2d(500,300);  glVertex2d(Axis[1].x,Axis[1].y);  //Y轴  
  155.     glVertex2d(Axis[1].x-35,Axis[1].y+15);  glVertex2d(Axis[1].x-30,Axis[1].y+10);  
  156.     glVertex2d(Axis[1].x-25,Axis[1].y+15);  glVertex2d(Axis[1].x-30,Axis[1].y+10);  
  157.     glVertex2d(Axis[1].x-30,Axis[1].y+5);   glVertex2d(Axis[1].x-30,Axis[1].y+10);  
  158.     glVertex2d(Axis[1].x-5,Axis[1].y-5);    glVertex2d(Axis[1].x,Axis[1].y);  
  159.     glVertex2d(Axis[1].x-5,Axis[1].y+5);    glVertex2d(Axis[1].x,Axis[1].y);  
  160.     glVertex2d(500,300);  glVertex2d(Axis[0].x,Axis[0].y);  //X轴  
  161.     glVertex2d(Axis[0].x+15,Axis[0].y+25);  glVertex2d(Axis[0].x+25,Axis[0].y+15);  
  162.     glVertex2d(Axis[0].x+15,Axis[0].y+15);   glVertex2d(Axis[0].x+25,Axis[0].y+25);  
  163.     glVertex2d(Axis[0].x+5,Axis[0].y-5);  glVertex2d(Axis[0].x,Axis[0].y);  
  164.     glVertex2d(Axis[0].x+5,Axis[0].y+5);  glVertex2d(Axis[0].x,Axis[0].y);  
  165.     glEnd();  
  166. }  
  167.   
  168. /************************************************** 
  169. *参数:无参数 
  170. *功能:三维图形变换主函数 
  171. ***************************************************/  
  172. void GetProcess()  
  173. {  
  174.     MycubeInit();  
  175. //  MyTriangularPrismInit();  
  176.     MyTrans(TPoint,MyPoint,Change);  
  177.     MyTrans(TPoint,TPoint,Matrix);  
  178. }  
  179.   
  180. /************************************************** 
  181. *参数:无参数 
  182. *功能:绘制用户的图形 
  183. ***************************************************/  
  184. void Display()  
  185. {     
  186.     glClear(GL_COLOR_BUFFER_BIT);  
  187.     GetProcess();  
  188.     OnDraw(TPoint);  
  189.     OnCoordinate(TPoint);  
  190.     glutSwapBuffers();  
  191. }  
  192.   
  193. /************************************************** 
  194. *参数:无参数 
  195. *功能:窗口的初始化 
  196. ***************************************************/  
  197. void MyInit()  
  198. {     
  199.     glClearColor(0.0f, 0.0f, 0.0f, 1.0f);  
  200.     for(int i=0;i<10;i++)  
  201.         MyFace[i].clear();  
  202.     MycubeInit();  
  203. //  MyTriangularPrismInit();  
  204.     anga=PI/4,angb=PI/6;  
  205. }  
  206.   
  207. /************************************************** 
  208. *参数:按键类型等 
  209. *功能:键盘响应函数 
  210. ***************************************************/  
  211. void SpecialKeys(int key,int x,int y)  
  212. {  
  213.     if(key==GLUT_KEY_UP)  
  214.         anga+=PI/180;  
  215.     if(key==GLUT_KEY_DOWN)  
  216.         anga-=PI/180;  
  217.     if(key==GLUT_KEY_LEFT)  
  218.         angb+=PI/180;  
  219.     if(key==GLUT_KEY_RIGHT)  
  220.         angb-=PI/180;  
  221.     double Sina=sin(anga),  Cosa=cos(anga),   Sinb=sin(angb),  Cosb=cos(angb);  
  222.     Change[0][0]=Cosa,   Change[0][1]=-Sina*Sinb,   Change[0][2]=Sina*Cosb;  
  223.     Change[1][0]=0,      Change[1][1]=Cosb,         Change[1][2]=Sinb;  
  224.     Change[2][0]=-Sina,  Change[2][1]= -Cosa*Sinb,  Change[2][2]=Cosa*Cosb;  
  225.     Display();  
  226. }  
  227.   
  228. int main(int argc, char* argv[])  
  229. {  
  230.     glutInit(&argc,argv);  
  231.     glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);  
  232.     glutInitWindowSize(1000,600);   
  233.     glutInitWindowPosition(0,0);  
  234.     glutCreateWindow("我的三维图形——立方体正轴测图演示程序");   
  235.     glutDisplayFunc(Display);   
  236.     glutReshapeFunc(ChangeSize);  
  237.     glutSpecialFunc(SpecialKeys);  
  238.     MyInit();                                      
  239.     glutMainLoop();                                 
  240.     return 0;  
  241. }  

  1. //消隐算法—深度缓冲器算法改进版.cpp  
  2. #include<gl/glut.h>  
  3. #include<windows.h>  
  4. #include<iostream>  
  5. #include<algorithm>  
  6. #include<cmath>  
  7. #include<vector>  
  8. using namespace std;  
  9.   
  10. const int MAXN=200;  
  11. const int INF=1<<30;  
  12. const double eps=1e-10;  
  13. int winWidth=1000,winHeight=600;//窗口宽高  
  14. int MyPointNum=0;  //用户图形的顶点数  
  15. double PI=acos(-1.0);  
  16. double anga=PI/4,angb=PI/6;;  
  17. double Matrix[4][4]={{1,0,0,0},{0,1,0,0},{0,0,1,0},{500,300,300,1}};//初始化为单位矩阵  
  18. double Chang[4][4]={{1,0,0,0},{0,1,0,0},{0,0,1,0},{0,0,0,1}};//各种基本变换矩阵;  
  19. double Touying[4][4]={{1,0,0,0},{0,1,0,0},{0,0,0,0},{0,0,0,1}};//投影到XOY平面矩阵  
  20. vector<int>MyFace[10];//存放面与顶点的拓扑信息  
  21. int MyFaceNum=0;  
  22. struct point  
  23. {  
  24.     double x,y,z,tag;  
  25. }MyPoint[MAXN],ProcessPoint[MAXN],ResultPoint[MAXN];//定义图形的顶点  
  26. struct piexl  
  27. {  
  28.     int color;  
  29.     double deepth;  
  30. }MyPiexl[1024][10240];//存放屏幕像素点的深度与颜色  
  31.   
  32. /************************************************** 
  33. *参数:前四个参数指定平面上的三个顶点,后面为某点的x,y坐标 
  34. *功能:计算深度 
  35. ***************************************************/  
  36. double GetZ(point TmpPoint[],int id1,int id2,int id3,double x,double y)  
  37. {  
  38.     double x2_x1=TmpPoint[id2].x-TmpPoint[id1].x;  
  39.     double x3_x1=TmpPoint[id3].x-TmpPoint[id1].x;  
  40.   
  41.     double y2_y1=TmpPoint[id2].y-TmpPoint[id1].y;  
  42.     double y3_y1=TmpPoint[id3].y-TmpPoint[id1].y;  
  43.   
  44.     double Z2_Z1=TmpPoint[id2].z-TmpPoint[id1].z;  
  45.     double Z3_Z1=TmpPoint[id3].z-TmpPoint[id1].z;  
  46.   
  47.     double tmp=(x-TmpPoint[id1].x)*y2_y1*Z3_Z1+(x3_x1)*(y-TmpPoint[id1].y)*Z2_Z1-y3_y1*Z2_Z1*((x-TmpPoint[id1].x))  
  48.         -Z3_Z1*x2_x1*(y-TmpPoint[id1].y);  
  49.     if((y2_y1*x3_x1-x2_x1*y3_y1)==0)  
  50.         return -INF;//投影成一条线  
  51.     return (tmp+TmpPoint[id1].z*(y2_y1*x3_x1-x2_x1*y3_y1))/(y2_y1*x3_x1-x2_x1*y3_y1);  
  52. }  
  53.   
  54. /******************************************************* 
  55. *参数:无参数 
  56. *功能:深度缓冲器算法的具体实现 
  57. ********************************************************/  
  58. void XiaoYin(point TmpPoint[],int id)  
  59. {  
  60.     int size=MyFace[id].size();  
  61.     int MinY=INF,MaxY=-INF;  
  62.     for(int i=0;i<size;i++)  
  63.     {  
  64.         if(TmpPoint[MyFace[id][i]].y>MaxY)  
  65.             MaxY=TmpPoint[MyFace[id][i]].y;  
  66.         if(TmpPoint[MyFace[id][i]].y<MinY)  
  67.             MinY=TmpPoint[MyFace[id][i]].y;  
  68.     }  
  69.     for(int y=MinY;y<=MaxY;y++)  
  70.     {  
  71.         vector<int>Vec;  
  72.         for(int i=0;i<size;i++)  
  73.         {  
  74.             if(TmpPoint[MyFace[id][i]].y==y)  
  75.             {  
  76.                 Vec.push_back(TmpPoint[MyFace[id][i]].x);  
  77.                 if((TmpPoint[MyFace[id][(i+1)%size]].y-TmpPoint[MyFace[id][i]].y)*(TmpPoint[MyFace[id][(i-1+size)%size]].y-TmpPoint[MyFace[id][i]].y)>0)  
  78.                 {  
  79.                     Vec.push_back(TmpPoint[MyFace[id][i]].x);  
  80.                 }  
  81.             }  
  82.             if((TmpPoint[MyFace[id][i]].y<y&&TmpPoint[MyFace[id][(i+1)%size]].y>y)||(TmpPoint[MyFace[id][i]].y>y&&TmpPoint[MyFace[id][(i+1)%size]].y<y))//y∈(y1,y2)或y∈(y2,y1)  
  83.             {  
  84.                 int x=TmpPoint[MyFace[id][i]].x+(y-TmpPoint[MyFace[id][i]].y)*(TmpPoint[MyFace[id][(i+1)%size]].x-TmpPoint[MyFace[id][i]].x)  
  85.                     /(TmpPoint[MyFace[id][(i+1)%size]].y-TmpPoint[MyFace[id][i]].y);//此处暂直接取整  
  86.                 Vec.push_back(x);  
  87.             }  
  88.         }  
  89.         sort(Vec.begin(),Vec.end());  
  90.         int tmpsize=Vec.size();  
  91.         for(int i=0;i<tmpsize;i+=2)  
  92.         {  
  93.             for(int j=Vec[i];j<=Vec[i+1];j++)  
  94.             {  
  95.                 double tmpz=GetZ(TmpPoint,MyFace[id][0],MyFace[id][1],MyFace[id][2],j,y);  
  96.                 if(tmpz>MyPiexl[j][y].deepth)  
  97.                 {  
  98.                     MyPiexl[j][y].deepth=tmpz,MyPiexl[j][y].color=id;  
  99.                 }  
  100.             }  
  101.         }  
  102.     }  
  103. }  
  104.   
  105. /************************************************** 
  106. *参数:无参数 
  107. *功能:初始化每个像素 
  108. ***************************************************/  
  109. void PiexInit()  
  110. {  
  111.     for(int i=0;i<1000;i++)  
  112.     {  
  113.         for(int j=0;j<600;j++)  
  114.         {  
  115.             MyPiexl[i][j].color=-1;  
  116.             MyPiexl[i][j].deepth=-INF;  
  117.         }  
  118.     }  
  119. }  
  120.   
  121. /************************************************** 
  122. *参数:无参数 
  123. *功能:初始化自定义立方体 
  124. ***************************************************/  
  125. void MycubeInit()  
  126. {  
  127.     MyPointNum=8;  
  128.     MyPoint[0].x=0,MyPoint[0].y=0,MyPoint[0].z=0,MyPoint[0].tag=1;  
  129.     MyPoint[1].x=100,MyPoint[1].y=0,MyPoint[1].z=0,MyPoint[1].tag=1;  
  130.     MyPoint[2].x=100,MyPoint[2].y=100,MyPoint[2].z=0,MyPoint[2].tag=1;  
  131.     MyPoint[3].x=0,MyPoint[3].y=100,MyPoint[3].z=0,MyPoint[3].tag=1;  
  132.   
  133.     MyPoint[4].x=0,   MyPoint[4].y=0,   MyPoint[4].z=250,  MyPoint[4].tag=1;  
  134.     MyPoint[5].x=100, MyPoint[5].y=0,   MyPoint[5].z=250,  MyPoint[5].tag=1;  
  135.     MyPoint[6].x=100, MyPoint[6].y=100, MyPoint[6].z=250,  MyPoint[6].tag=1;  
  136.     MyPoint[7].x=0, MyPoint[7].y=100,   MyPoint[7].z=250,  MyPoint[7].tag=1;  
  137.   
  138.     MyFaceNum=6;  
  139.     MyFace[0].push_back(0);MyFace[0].push_back(1);MyFace[0].push_back(2);MyFace[0].push_back(3);  
  140.     MyFace[1].push_back(0);MyFace[1].push_back(1);MyFace[1].push_back(5);MyFace[1].push_back(4);  
  141.     MyFace[2].push_back(1);MyFace[2].push_back(2);MyFace[2].push_back(6);MyFace[2].push_back(5);  
  142.     MyFace[3].push_back(2);MyFace[3].push_back(3);MyFace[3].push_back(7);MyFace[3].push_back(6);  
  143.     MyFace[4].push_back(3);MyFace[4].push_back(0);MyFace[4].push_back(4);MyFace[4].push_back(7);  
  144.     MyFace[5].push_back(4);MyFace[5].push_back(5);MyFace[5].push_back(6);MyFace[5].push_back(7);  
  145.   
  146. }  
  147.   
  148. /************************************************** 
  149. *参数:无参数 
  150. *功能:初始化自定义三棱柱 
  151. ***************************************************/  
  152. void MyTriangularPrismInit()  
  153. {  
  154.     MyPointNum=6;  
  155.     MyPoint[0].x=0,   MyPoint[0].y=0,   MyPoint[0].z=0,    MyPoint[0].tag=1;  
  156.     MyPoint[1].x=0,   MyPoint[1].y=200, MyPoint[1].z=0,    MyPoint[1].tag=1;  
  157.     MyPoint[2].x=0,   MyPoint[2].y=100, MyPoint[2].z=100,  MyPoint[2].tag=1;  
  158.   
  159.     MyPoint[3].x=300, MyPoint[3].y=0,   MyPoint[3].z=0,    MyPoint[3].tag=1;  
  160.     MyPoint[4].x=300, MyPoint[4].y=200, MyPoint[4].z=0,    MyPoint[4].tag=1;  
  161.     MyPoint[5].x=300, MyPoint[5].y=100, MyPoint[5].z=100,  MyPoint[5].tag=1;  
  162.       
  163.     MyFaceNum=6;  
  164.     MyFace[0].push_back(0);MyFace[0].push_back(1);MyFace[0].push_back(2);  
  165.     MyFace[1].push_back(0);MyFace[1].push_back(1);MyFace[1].push_back(4);MyFace[1].push_back(3);  
  166.     MyFace[3].push_back(1);MyFace[3].push_back(2);MyFace[3].push_back(5);MyFace[3].push_back(4);  
  167.     MyFace[4].push_back(2);MyFace[4].push_back(0);MyFace[4].push_back(3);MyFace[4].push_back(5);  
  168.     MyFace[5].push_back(3);MyFace[5].push_back(4);MyFace[5].push_back(5);  
  169. }  
  170. /************************************************** 
  171. *参数:OldPoint,Tran[4][4],NewPoint分别表示变换前顶点信息、变换矩阵、变换后顶点信息 
  172. *功能:获得变换后的用户图形的顶点 
  173. ***************************************************/  
  174. void MyTrans(point NewPoint[],point OldPoint[],double Tran[4][4])  
  175. {  
  176.     double tx,ty,tz,ttag;  
  177.     for(int i=0;i<MyPointNum;i++)  
  178.     {  
  179.         tx=OldPoint[i].x,ty=OldPoint[i].y,tz=OldPoint[i].z,ttag=OldPoint[i].tag;  
  180.         NewPoint[i].x=tx*Tran[0][0]+ty*Tran[1][0]+tz*Tran[2][0]+ttag*Tran[3][0];  
  181.         NewPoint[i].y=tx*Tran[0][1]+ty*Tran[1][1]+tz*Tran[2][1]+ttag*Tran[3][1];  
  182.         NewPoint[i].z=tx*Tran[0][2]+ty*Tran[1][2]+tz*Tran[2][2]+ttag*Tran[3][2];  
  183.         NewPoint[i].tag=tx*Tran[0][3]+ty*Tran[1][3]+tz*Tran[2][3]+ttag*Tran[3][3];  
  184.     }  
  185. }  
  186.   
  187. /************************************************** 
  188. *参数:TmpPoint表示需绘制图形的顶点 
  189. *功能:绘制指定的图形 
  190. ***************************************************/  
  191. void OnDraw(point TmpPoint[])  
  192. {  
  193.     glBegin(GL_POINTS);   
  194.     for(int i=0;i<1000;i++)  
  195.     {  
  196.         for(int j=0;j<600;j++)  
  197.         {  
  198.             switch(MyPiexl[i][j].color)  
  199.             {  
  200.             case 0:glColor3f(1.0f,0.0f,0.0f);break;  
  201.             case 1:glColor3f(0.0f,1.0f,0.0f);break;  
  202.             case 2:glColor3f(0.0f,0.0f,1.0f);break;  
  203.             case 3:glColor3f(1.0f,1.0f,0.0f);break;  
  204.             case 4:glColor3f(1.0f,0.0f,1.0f);break;  
  205.             case 5:glColor3f(0.0f,1.0f,1.0f);break;  
  206.             default:glColor3f(0.0f,0.0f,0.0f);break;  
  207.             }  
  208.             glVertex2i(i,j);  
  209.         }  
  210.     }  
  211.     glEnd();  
  212. }  
  213.   
  214. /************************************************** 
  215. *参数:无参数 
  216. *功能:绘制用户的图形 
  217. ***************************************************/  
  218. void Display()  
  219. {     
  220.     glClear(GL_COLOR_BUFFER_BIT);  
  221.     OnDraw(ResultPoint);  
  222.     glutSwapBuffers();  
  223. }  
  224.   
  225. /************************************************** 
  226. *参数:无参数 
  227. *功能:三维图形变换的主函数 
  228. ***************************************************/  
  229. void GetProcess()  
  230. {  
  231.     PiexInit();  
  232.     MyTrans(ProcessPoint,MyPoint,Chang);//几何变换  
  233.     MyTrans(ResultPoint,ProcessPoint,Matrix);//平移  
  234.         for(int i=0;i<MyFaceNum;i++)//依次计算所有面  
  235.         XiaoYin(ResultPoint,i);  
  236.     MyTrans(ResultPoint,ResultPoint,Touying);//投影  
  237. }  
  238.   
  239. /************************************************** 
  240. *参数:无参数 
  241. *功能:窗口的初始化 
  242. ***************************************************/  
  243. void MyInit()  
  244. {  
  245.     glClearColor(0.0f, 0.0f, 0.0f, 1.0f);  
  246.     MyTriangularPrismInit();  
  247.     anga=PI/4;angb=PI/6;  
  248.     GetProcess();  
  249. }  
  250.   
  251. /************************************************** 
  252. *参数:w表示窗口宽,h表示窗口的高 
  253. *功能:重新指定窗口的宽高 
  254. ***************************************************/  
  255. void ChangeSize(int w, int h)  
  256. {     
  257.     winWidth=w;winHeight=h;  
  258.     glViewport(0,0,w,h);   
  259.     glMatrixMode(GL_PROJECTION);  
  260.     glLoadIdentity();  
  261.     gluOrtho2D(0.0,winWidth,0.0,winHeight);  
  262. }  
  263.   
  264. /************************************************** 
  265. *参数:键盘按键类型等 
  266. *功能:键盘响应函数 
  267. ***************************************************/  
  268. void MyKeyPcocess(int key,int x,int y)  
  269. {  
  270.     if(key==GLUT_KEY_UP)  
  271.         anga+=PI/180;  
  272.     if(key==GLUT_KEY_DOWN)  
  273.         anga-=PI/180;  
  274.     if(key==GLUT_KEY_LEFT)  
  275.         angb+=PI/180;  
  276.     if(key==GLUT_KEY_RIGHT)  
  277.         angb-=PI/180;  
  278.     double Sina=sin(anga),  Cosa=cos(anga),   Sinb=sin(angb),  Cosb=cos(angb);  
  279.     Chang[0][0]=Cosa,   Chang[0][1]=-Sina*Sinb,   Chang[0][2]=Sina*Cosb;  
  280.     Chang[1][0]=0,      Chang[1][1]=Cosb,         Chang[1][2]=Sinb;  
  281.     Chang[2][0]=-Sina,  Chang[2][1]= -Cosa*Sinb,  Chang[2][2]=Cosa*Cosb;  
  282.     GetProcess();  
  283.     Display();  
  284. }  
  285.   
  286. /************************************************** 
  287. *参数:菜单选项 
  288. *功能:菜单响应函数 
  289. ***************************************************/  
  290. void MyMenuProcess(int value)  
  291. {  
  292.     for(int i=0;i<10;i++)  
  293.         MyFace[i].clear();  
  294.     if(1==value)  
  295.         MycubeInit();  
  296.     if(2==value)  
  297.         MyTriangularPrismInit();  
  298.     GetProcess();  
  299.     glutPostRedisplay();  
  300. }  
  301.   
  302.   
  303. int main(int argc, char* argv[])  
  304. {  
  305.     glutInit(&argc,argv);  
  306.     glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);  
  307.     glutInitWindowSize(1000,600);   
  308.     glutInitWindowPosition(0,0);  
  309.     glutCreateWindow("我的三维图形消隐---深度缓冲器算法演示程序");   
  310.     glutDisplayFunc(Display);   
  311.     glutReshapeFunc(ChangeSize);  
  312.     glutSpecialFunc(MyKeyPcocess);  
  313.     glutCreateMenu(MyMenuProcess);  
  314.     glutAddMenuEntry("长方体",1);  
  315.     glutAddMenuEntry("三棱柱",2);  
  316.     glutAttachMenu(GLUT_RIGHT_BUTTON);  
  317.     MyInit();                                      
  318.     glutMainLoop();                                 
  319.     return 0;  
  320. }  
  321.    

以下是运行结果截图


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多