免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2474 | 回复: 8
打印 上一主题 下一主题

用C写的一个三维魔方 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-06-16 14:17 |只看该作者 |倒序浏览
本来是在windows下写的,在linux编译了一下。
还不错,只是把#include<windows.h>;这一句删掉就编译通过了。
http://www.cnblogs.com/Files/lj0508/main.rar
按F1~F9,和方向键可以控制魔方的转动


  1. #include <stdlib.h>;
  2. #include <GL/glut.h>;
  3. //小方块的结构,包括小方块在x,y,z上的旋转角度,颜色数组下标,小方块的三维坐标。
  4. struct rcube{
  5.     int xr;
  6.     int yr;
  7.     int zr;
  8.     int cl[6];
  9.     GLfloat x;
  10.     GLfloat y;
  11.     GLfloat z;
  12. };
  13. struct rcube rc[3][3][3];
  14. struct rcube *temp[3][3];
  15. //颜色数组
  16. GLfloat color[6][3]={{1.0,0.0,0.0},{0.0,1.0,0.0},{0.0,0.0,1.0},
  17.                      {1.0,1.0,0.0},{1.0,0.0,1.0},{0.0,1.0,1.0}};
  18. int tempc[3][3][6];
  19. //有关旋转的一些变量
  20. GLfloat xRot = 10.0f;
  21. GLfloat yRot = 10.0f;
  22. int rotateType=0;
  23. int rotateOK=0;
  24. int rotateRate=50;
  25. int rotate=0;
  26. ///////////////////////////////////////////////////////////////////////////////
  27. //画小方块
  28. void drawcube(int cl[6])
  29. {   
  30.     glBegin(GL_QUADS);
  31. //右面
  32.     glColor3fv(color[cl[0]]);
  33.     glVertex3f(0.14f,-0.14f,-0.14f);
  34.     glVertex3f(0.14f,0.14f,-0.14f);
  35.     glVertex3f(0.14f,0.14f,0.14f);
  36.     glVertex3f(0.14f,-0.14f,0.14f);
  37. //左面
  38.     glColor3fv(color[cl[1]]);
  39.     glVertex3f(-0.14f,-0.14f,0.14f);
  40.     glVertex3f(-0.14f,0.14f,0.14f);
  41.     glVertex3f(-0.14f,0.14f,-0.14f);
  42.     glVertex3f(-0.14f,-0.14f,-0.14f);
  43. //前面
  44.     glColor3fv(color[cl[2]]);
  45.     glVertex3f(-0.14f,0.14f,0.14f);
  46.     glVertex3f(-0.14f,-0.14f,0.14f);
  47.     glVertex3f(0.14f,-0.14f,0.14f);
  48.     glVertex3f(0.14f,0.14f,0.14f);
  49. //后面
  50.     glColor3fv(color[cl[3]]);
  51.     glVertex3f(-0.14f,0.14f,-0.14f);
  52.     glVertex3f(0.14f,0.14f,-0.14f);
  53.     glVertex3f(0.14f,-0.14f,-0.14f);
  54.     glVertex3f(-0.14f,-0.14f,-0.14f);
  55. //上面
  56.     glColor3fv(color[cl[4]]);
  57.     glVertex3f(-0.14f,0.14f,-0.14f);
  58.     glVertex3f(-0.14f,0.14f,0.14f);   
  59.     glVertex3f(0.14f,0.14f,0.14f);
  60.     glVertex3f(0.14f,0.14f,-0.14f);
  61. //下面
  62.     glColor3fv(color[cl[5]]);
  63.     glVertex3f(-0.14f,-0.14f,-0.14f);
  64.     glVertex3f(0.14f,-0.14f,-0.14f);
  65.     glVertex3f(0.14f,-0.14f,0.14f);
  66.     glVertex3f(-0.14f,-0.14f,0.14f);
  67.     glEnd();
  68.     glFlush();
  69. }   
  70. //窗口刷新时被调用。
  71. void RenderScene(void)
  72. {
  73.     int i,j,k;
  74.         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  75.         glPushMatrix();       
  76.         glRotatef(xRot, 1.0f, 0.0f, 0.0f);
  77.         glRotatef(yRot, 0.0f, 1.0f, 0.0f);
  78.         for(i=0;i<3;i++)
  79.         {
  80.             for(j=0;j<3;j++)
  81.             {
  82.                 for(k=0;k<3;k++)
  83.                 {
  84.                     //魔方在这显示
  85.                     glPushMatrix();             
  86.                 glRotatef(rc[i][j][k].xr, 1.0f, 0.0f, 0.0f);
  87.                 glRotatef(rc[i][j][k].zr, 0.0f, 0.0f, 1.0f);
  88.                 glRotatef(rc[i][j][k].yr, 0.0f, 1.0f, 0.0f);     
  89.                 glTranslatef(rc[i][j][k].x,rc[i][j][k].y,rc[i][j][k].z);               
  90.                     drawcube(rc[i][j][k].cl);            
  91.                     glPopMatrix();
  92.                 }
  93.         }
  94.     }            
  95.         glPopMatrix();
  96.         glutSwapBuffers();
  97. }
  98. //初始化。
  99. void SetupRC()
  100. {
  101.     GLfloat x,y,z;
  102.         int i,j,k,l;
  103.         for(i=0,x=-0.3f;i<3;i++,x+=0.3f)
  104.         {
  105.             for(j=0,y=-0.3f;j<3;j++,y+=0.3f)
  106.             {
  107.                 for(k=0,z=-0.3f;k<3;k++,z+=0.3f)
  108.                 {
  109.                     rc[i][j][k].x=x;rc[i][j][k].xr=0;
  110.                 rc[i][j][k].y=y;rc[i][j][k].yr=0;
  111.                 rc[i][j][k].z=z;rc[i][j][k].zr=0;                                      
  112.                 for(l=0;l<6;l++)
  113.                 {
  114.                     rc[i][j][k].cl[l]=l;                           
  115.                 }   
  116.              }
  117.          }
  118.      }
  119.         glClearColor(0.0f, 0.0f, 0.0f, 1.0f );
  120.     glEnable(GL_DEPTH_TEST);
  121.     glEnable(GL_CULL_FACE);
  122. }
  123. //选择转动的那一组小方块。
  124. void elect(int type)
  125. {
  126.     int i,j;  
  127.     for(i=0;i<3;i++)
  128.     {
  129.         for(j=0;j<3;j++)
  130.         {
  131.             switch (type)
  132.             {
  133.                 case 1:
  134.                     temp[i][j]=&rc[0][i][j]; break;
  135.                 case 2:
  136.                     temp[i][j]=&rc[1][i][j]; break;
  137.                 case 3:
  138.                     temp[i][j]=&rc[2][i][j]; break;
  139.                 case 4:
  140.                     temp[i][j]=&rc[j][0][i]; break;
  141.                 case 5:
  142.                     temp[i][j]=&rc[j][1][i]; break;
  143.                 case 6:
  144.                     temp[i][j]=&rc[j][2][i]; break;
  145.                 case 7:
  146.                     temp[i][j]=&rc[i][j][0]; break;
  147.                 case 8:
  148.                     temp[i][j]=&rc[i][j][1]; break;
  149.                 case 9:
  150.                     temp[i][j]=&rc[i][j][2]; break;
  151.             }            
  152.         }
  153.     }     
  154. }
  155. //判断是否胜利。
  156. int win(void)
  157. {
  158.     int i,j,k,c,cl[6];
  159.     for(k=0;k<6;k++)
  160.     {
  161.         cl[k]=rc[0][0][0].cl[k];
  162.     }   
  163.     for(i=0;i<3;i++)
  164.     {
  165.         for(j=0;j<3;j++)
  166.         {
  167.             for(k=0;k<3;k++)
  168.             {
  169.                 for(c=0;c<6;c++)
  170.                 {
  171.                     if(rc[i][j][k].cl[c]!=cl[c])
  172.                         return 0;
  173.                 }   
  174.             }   
  175.         }   
  176.     }
  177.     return 1;
  178. }   
  179. //转动小方块,实际上是交换颜色。
  180. void shift(void)
  181. {   
  182.     int i,j,k,c;
  183.     elect(rotateType);
  184.     for(i=0;i<3;i++)
  185.     {
  186.         for(j=0;j<3;j++)
  187.         {
  188.             (*temp[i][j]).xr=0;
  189.             (*temp[i][j]).yr=0;
  190.             (*temp[i][j]).zr=0;   
  191.             if(rotateType>;0&&rotateType<=3)
  192.             {
  193.                 c=(*temp[i][j]).cl[2];
  194.                 (*temp[i][j]).cl[2]=(*temp[i][j]).cl[4];
  195.                 (*temp[i][j]).cl[4]=(*temp[i][j]).cl[3];
  196.                 (*temp[i][j]).cl[3]=(*temp[i][j]).cl[5];
  197.                 (*temp[i][j]).cl[5]=c;
  198.             }
  199.             if(rotateType>;3&&rotateType<=6)
  200.             {
  201.                 c=(*temp[i][j]).cl[0];
  202.                 (*temp[i][j]).cl[0]=(*temp[i][j]).cl[2];
  203.                 (*temp[i][j]).cl[2]=(*temp[i][j]).cl[1];
  204.                 (*temp[i][j]).cl[1]=(*temp[i][j]).cl[3];
  205.                 (*temp[i][j]).cl[3]=c;
  206.             }
  207.             if(rotateType>;6&&rotateType<=9)
  208.             {
  209.                 c=(*temp[i][j]).cl[4];
  210.                 (*temp[i][j]).cl[4]=(*temp[i][j]).cl[0];
  211.                 (*temp[i][j]).cl[0]=(*temp[i][j]).cl[5];
  212.                 (*temp[i][j]).cl[5]=(*temp[i][j]).cl[1];
  213.                 (*temp[i][j]).cl[1]=c;
  214.             }
  215.             for(k=0;k<6;k++)
  216.             {
  217.                 tempc[2-j][i][k]=(*temp[i][j]).cl[k];
  218.             }
  219.         }
  220.     }   
  221.     for(i=0;i<3;i++)
  222.     {
  223.         for(j=0;j<3;j++)
  224.         {
  225.             for(k=0;k<6;k++)
  226.             {
  227.                 (*temp[i][j]).cl[k]=tempc[i][j][k];
  228.             }   
  229.         }
  230.     }
  231. //如果完成将背景色设成黑色,否则设成灰色。
  232.     if(win()==1)
  233.         glClearColor(0.0f, 0.0f, 0.0f, 1.0f );
  234.     else
  235.         glClearColor(0.5f, 0.5f, 0.5f, 1.0f );
  236. }   
  237. //转动魔方,也就是改变小方块在x,y,z上的旋转角度。
  238. void turn (void)
  239. {
  240.     int j,k;
  241.     elect(rotateType);
  242.     for(j=0;j<3;j++)
  243.     {
  244.         for(k=0;k<3;k++)
  245.         {            
  246.             if(rotateType>;0&&rotateType<=3)
  247.                 (*temp[j][k]).xr+=10;
  248.             if(rotateType>;3&&rotateType<=6)
  249.                 (*temp[j][k]).yr+=10;
  250.             if(rotateType>;6&&rotateType<=9)
  251.                 (*temp[j][k]).zr+=10;            
  252.         }
  253.     }
  254. }   
  255. //定时器回调函数,当魔方转动时产生动画。
  256. void TimerFunc(int value)
  257. {
  258.     rotate+=10;        
  259.     turn();
  260.     glutPostRedisplay();
  261.     if(rotate==90)
  262.     {
  263.         shift();
  264.         rotate=0;
  265.         rotateOK=0;        
  266.         rotateType=0;        
  267.         return;
  268.     }             
  269.         glutTimerFunc(rotateRate,TimerFunc,1);
  270. }
  271. //接收键盘输入。
  272. void SpecialKeys(int key, int x, int y)
  273. {
  274.     int temp=0;
  275.     switch (key)
  276.     {     
  277.         case GLUT_KEY_F1:
  278.             temp=1; break;
  279.         case GLUT_KEY_F2:
  280.             temp=2; break;
  281.         case GLUT_KEY_F3:
  282.             temp=3; break;                       
  283.         case GLUT_KEY_F4:
  284.             temp=4; break;
  285.         case GLUT_KEY_F5:
  286.             temp=5; break;
  287.         case GLUT_KEY_F6:
  288.             temp=6; break;
  289.         case GLUT_KEY_F7:
  290.             temp=7; break;
  291.         case GLUT_KEY_F8:
  292.             temp=8; break;
  293.         case GLUT_KEY_F9:
  294.             temp=9; break;                                                   
  295.         case GLUT_KEY_UP:
  296.             xRot -= 5.0f; break;
  297.             case GLUT_KEY_DOWN:
  298.             xRot += 5.0f; break;
  299.             case GLUT_KEY_LEFT:
  300.             yRot -= 5.0f; break;
  301.             case GLUT_KEY_RIGHT:
  302.             yRot += 5.0f; break;
  303.     }
  304.     if ( rotateOK==0 && temp!=0)
  305.     {
  306.         rotateType=temp;
  307.         rotateOK=1;
  308.         glutTimerFunc(rotateRate,TimerFunc,1);
  309.     }
  310.     else temp=0;
  311.     if(xRot >; 356.0f) xRot = 0.0f;
  312.         if(xRot < -1.0f) xRot = 355.0f;
  313.         if(yRot >; 356.0f) yRot = 0.0f;
  314.         if(yRot < -1.0f) yRot = 355.0f;
  315.         glutPostRedisplay();        
  316. }
  317. //当窗口改变尺寸时被调用。
  318. void ChangeSize(int w, int h)
  319. {
  320.         GLfloat nRange = 1.9f;
  321.         if(h == 0)
  322.                 h = 1;
  323.     glViewport(0, 0, w, h);
  324.         glMatrixMode(GL_PROJECTION);
  325.         glLoadIdentity();
  326.     if (w <= h)
  327.                 glOrtho (-nRange, nRange, -nRange*h/w, nRange*h/w, -nRange, nRange);
  328.     else
  329.                 glOrtho (-nRange*w/h, nRange*w/h, -nRange, nRange, -nRange, nRange);
  330.         glMatrixMode(GL_MODELVIEW);
  331.         glLoadIdentity();
  332. }
  333. //主函数。
  334. int main(int argc, char* argv[])
  335. {
  336.         glutInit(&argc, argv);
  337.         glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  338.         glutCreateWindow("GLUT Shapes");       
  339.         glutReshapeFunc(ChangeSize);
  340.         glutSpecialFunc(SpecialKeys);
  341.         glutDisplayFunc(RenderScene);
  342.         SetupRC();
  343.         glutMainLoop();
  344.         return 0;
  345. }
复制代码

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2005-06-16 15:17 |只看该作者

用C写的一个三维魔方

glut.h
这个库是干什么的?
那里来的?

论坛徽章:
0
3 [报告]
发表于 2005-06-16 15:34 |只看该作者

用C写的一个三维魔方

原帖由 "mq110" 发表:
glut.h
这个库是干什么的?
那里来的?

OPENGL的辅助库啊;可以省好多事。

论坛徽章:
0
4 [报告]
发表于 2005-06-17 13:38 |只看该作者

用C写的一个三维魔方

学习一下。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
5 [报告]
发表于 2005-06-17 13:43 |只看该作者

用C写的一个三维魔方

>;>;OPENGL的辅助库啊;可以省好多事。
那里有下?

论坛徽章:
0
6 [报告]
发表于 2005-06-17 13:51 |只看该作者

用C写的一个三维魔方

倒!!!!
你不写图形程序要它干啥?

http://www.opengl.org/resources/libraries/glut.html

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
7 [报告]
发表于 2005-06-17 13:54 |只看该作者

用C写的一个三维魔方

学习。.

论坛徽章:
0
8 [报告]
发表于 2005-06-17 14:06 |只看该作者

用C写的一个三维魔方

学完了把笔记交上来审阅.

论坛徽章:
0
9 [报告]
发表于 2005-12-29 10:47 |只看该作者
不错 学习中
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP