原创作品,出自 “晓风残月xj” 博客,欢迎转载,转载时请务必注明出处(http://blog.csdn.net/xiaofengcanyuexj)。
由于各种原因,可能存在诸多不足,欢迎斧正!
由于报告遗失,在此只发代码,望见谅!
- //立方体透视图—一点透视改进版.cpp
-
- #include<gl/glut.h>
- #include<windows.h>
- #include<iostream>
- #include<algorithm>
- #include<cmath>
- using namespace std;
-
- const int MAXN=200;
- int winWidth=1000,winHeight=600;//窗口宽高
- int MyPointNum=0; //用户图形的顶点数
- double PI=acos(-1.0);//获取PI值
- double Matrix[4][4]={{1,0,0,0},{0,1,0,0},{0,0,1,0},{500,300,300,1}};//初始化为单位矩阵
- double dd=-500,nn=-400,mm=-320,ll=160;
- double T1[4][4]={{1,0,0,0},{0,1,0,0},{0,0,0,1/dd},{ll,mm,0,1+nn/dd}};//正等测图
- struct point
- {
- double x,y,z,tag;
- }MyPoint[MAXN],TPoint[MAXN];//定义图形的顶点
-
- /**************************************************
- *参数:无参数
- *功能:重置单位矩阵
- ***************************************************/
- void T1Init()
- {
- T1[0][0]=1; T1[0][1]=0; T1[0][2]=0; T1[0][3]=0;
- T1[1][0]=0; T1[1][1]=1; T1[1][2]=0; T1[1][3]=0;
- T1[2][0]=0; T1[2][1]=0; T1[2][2]=0; T1[2][3]=1/dd;
- T1[3][0]=ll; T1[3][1]=mm; T1[3][2]=0; T1[3][3]=1+nn/dd;
- }
-
- /**************************************************
- *参数:无参数
- *功能:初始化自定义图形
- ***************************************************/
- void MyPologyInit()
- {
- MyPointNum=8;
- MyPoint[0].x=0, MyPoint[0].y=0, MyPoint[0].z=0, MyPoint[0].tag=1;
- MyPoint[1].x=200, MyPoint[1].y=0, MyPoint[1].z=0, MyPoint[1].tag=1;
- MyPoint[2].x=200, MyPoint[2].y=200, MyPoint[2].z=0, MyPoint[2].tag=1;
- MyPoint[3].x=0, MyPoint[3].y=200, MyPoint[3].z=0, MyPoint[3].tag=1;
-
- MyPoint[4].x=0, MyPoint[4].y=0, MyPoint[4].z=200, MyPoint[4].tag=1;
- MyPoint[5].x=200, MyPoint[5].y=0, MyPoint[5].z=200, MyPoint[5].tag=1;
- MyPoint[6].x=200, MyPoint[6].y=200, MyPoint[6].z=200, MyPoint[6].tag=1;
- MyPoint[7].x=0, MyPoint[7].y=200, MyPoint[7].z=200, MyPoint[7].tag=1;
- }
-
- /**************************************************
- *参数:无参数
- *功能:获得变换后的用户图形的顶点
- ***************************************************/
- void MyTrans(point NewPoint[],point OldPoint[],double Tran[4][4])
- {
- for(int i=0;i<MyPointNum;i++)
- {
- double tx=OldPoint[i].x,ty=OldPoint[i].y,tz=OldPoint[i].z,ttag=OldPoint[i].tag;
- NewPoint[i].x=tx*Tran[0][0]+ty*Tran[1][0]+tz*Tran[2][0]+ttag*Tran[3][0];
- NewPoint[i].y=tx*Tran[0][1]+ty*Tran[1][1]+tz*Tran[2][1]+ttag*Tran[3][1];
- NewPoint[i].z=tx*Tran[0][2]+ty*Tran[1][2]+tz*Tran[2][2]+ttag*Tran[3][2];
- NewPoint[i].tag=tx*Tran[0][3]+ty*Tran[1][3]+tz*Tran[2][3]+ttag*Tran[3][3];
- if(NewPoint[i].tag!=0&&NewPoint[i].tag!=1)
- {
- NewPoint[i].x/=NewPoint[i].tag,NewPoint[i].y/=NewPoint[i].tag,NewPoint[i].z/=NewPoint[i].tag,NewPoint[i].tag=1;
- }
- }
- }
-
- /**************************************************
- *参数:w表示窗口宽,h表示窗口的高
- *功能:重新指定窗口的宽高
- ***************************************************/
- void ChangeSize(int w, int h)
- {
- winWidth=w;winHeight=h;
- glViewport(0,0,w,h);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluOrtho2D(0.0,winWidth,0.0,winHeight);
- }
-
- /**************************************************
- *参数:需绘制图形的顶点
- *功能:绘制指定的图形
- ***************************************************/
- void OnDraw(point TmpPoint[])
- {
- glColor3f(0.0f,1.0f,0.0f);
- glBegin(GL_LINES);
- glVertex2d(TmpPoint[0].x,TmpPoint[0].y); glVertex2d(TmpPoint[1].x,TmpPoint[1].y);
- glVertex2d(TmpPoint[0].x,TmpPoint[0].y); glVertex2d(TmpPoint[3].x,TmpPoint[3].y);
- glVertex2d(TmpPoint[0].x,TmpPoint[0].y); glVertex2d(TmpPoint[4].x,TmpPoint[4].y);
- glVertex2d(TmpPoint[1].x,TmpPoint[1].y); glVertex2d(TmpPoint[0].x,TmpPoint[0].y);
- glVertex2d(TmpPoint[1].x,TmpPoint[1].y); glVertex2d(TmpPoint[2].x,TmpPoint[2].y);
- glVertex2d(TmpPoint[1].x,TmpPoint[1].y); glVertex2d(TmpPoint[5].x,TmpPoint[5].y);
- glVertex2d(TmpPoint[2].x,TmpPoint[2].y); glVertex2d(TmpPoint[1].x,TmpPoint[1].y);
- glVertex2d(TmpPoint[2].x,TmpPoint[2].y); glVertex2d(TmpPoint[3].x,TmpPoint[3].y);
- glVertex2d(TmpPoint[2].x,TmpPoint[2].y); glVertex2d(TmpPoint[6].x,TmpPoint[6].y);
- glVertex2d(TmpPoint[3].x,TmpPoint[3].y); glVertex2d(TmpPoint[0].x,TmpPoint[0].y);
- glVertex2d(TmpPoint[3].x,TmpPoint[3].y); glVertex2d(TmpPoint[2].x,TmpPoint[2].y);
- glVertex2d(TmpPoint[3].x,TmpPoint[3].y); glVertex2d(TmpPoint[7].x,TmpPoint[7].y);
- glVertex2d(TmpPoint[4].x,TmpPoint[4].y); glVertex2d(TmpPoint[5].x,TmpPoint[5].y);
- glVertex2d(TmpPoint[5].x,TmpPoint[5].y); glVertex2d(TmpPoint[6].x,TmpPoint[6].y);
- glVertex2d(TmpPoint[6].x,TmpPoint[6].y); glVertex2d(TmpPoint[7].x,TmpPoint[7].y);
- glVertex2d(TmpPoint[7].x,TmpPoint[7].y); glVertex2d(TmpPoint[4].x,TmpPoint[4].y);
- glEnd();
-
- //求交点
- double x1_x0=TmpPoint[4].x-TmpPoint[0].x;
- double y1_y0=TmpPoint[4].y-TmpPoint[0].y;
- double x4_x3=TmpPoint[5].x-TmpPoint[1].x;
- double y4_y3=TmpPoint[5].y-TmpPoint[1].y;
- 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));
- double cro_y=y4_y3*(cro_x-TmpPoint[1].x)/x4_x3+TmpPoint[1].y;
-
- glColor3f(1.0f,1.0f,1.0f);
- glBegin(GL_LINES);
- glVertex2d(TmpPoint[0].x,TmpPoint[0].y); glVertex2d(cro_x,cro_y);
- glVertex2d(TmpPoint[1].x,TmpPoint[1].y); glVertex2d(cro_x,cro_y);
- glVertex2d(TmpPoint[2].x,TmpPoint[2].y); glVertex2d(cro_x,cro_y);
- glVertex2d(TmpPoint[3].x,TmpPoint[3].y); glVertex2d(cro_x,cro_y);
- glEnd();
- }
-
- /**************************************************
- *参数:无参数
- *功能:获得变换后的用户图形的顶点
- ***************************************************/
- void GetProcess()
- {
- T1Init();
- MyTrans(TPoint,MyPoint,T1);
- MyTrans(TPoint,TPoint,Matrix);
- }
-
- /**************************************************
- *参数:无参数
- *功能:绘制用户的图形
- ***************************************************/
- void Display()
- {
- glClear(GL_COLOR_BUFFER_BIT);
- GetProcess();
- OnDraw(TPoint);
- glutSwapBuffers();
- }
-
- /**************************************************
- *参数:无参数
- *功能:窗口的初始化
- ***************************************************/
- void MyInit()
- {
- glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
- MyPologyInit();
- dd=-500,nn=-400,mm=-320,ll=160;
- }
-
- /**************************************************
- *参数:按键类型等
- *功能:改变视距
- ***************************************************/
- void SpecialKeys(int key,int x,int y)
- {
- if(key==GLUT_KEY_UP)dd-=100;
- if(key==GLUT_KEY_DOWN)dd+=100;
- glutPostRedisplay();
- }
-
- int main(int argc, char* argv[])
- {
- glutInit(&argc,argv);
- glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
- glutInitWindowSize(1000,600);
- glutInitWindowPosition(0,0);
- glutCreateWindow("我的三维图形透视图——一点透视演示程序");
- glutDisplayFunc(Display);
- glutReshapeFunc(ChangeSize);
- glutSpecialFunc(SpecialKeys);
- MyInit();
- glutMainLoop();
- return 0;
- }
- //三视图改进版.cpp
-
- #include<gl/glut.h>
- #include<windows.h>
- #include<iostream>
- #include<algorithm>
- #include<cmath>
- #include<vector>
- using namespace std;
-
- const int MAXN=200;
- int winWidth=1000,winHeight=600;//窗口宽高
- int MyPointNum=0; //用户图形的顶点数
- double PI=acos(-1.0);//获取PI值
- double Matrix[4][4]={{1,0,0,0},{0,1,0,0},{0,0,1,0},{500,300,300,1}};//初始化为单位矩阵
- double XOZ[4][4]={{1,0,0,0},{0,0,0,0},{0,0,1,0},{0,0,0,1}};//主视图
- double XOY[4][4]={{1,0,0,0},{0,0,-1,0},{0,0,0,0},{0,0,-50,1}};//俯视图
- double YOZ[4][4]={{0,0,0,0},{-1,0,0,0},{0,0,1,0},{-50,0,0,1}};//侧视图
- struct point
- {
- double x,y,z,tag;
- }MyPoint[MAXN],XOZPoint[MAXN],XOYPoint[MAXN],YOZPoint[MAXN];//定义图形的顶点
- vector<int>MyFace[10];
- int MyFaceNum=6;
-
- /**************************************************
- *参数:无参数
- *功能:初始化自定义立方体
- ***************************************************/
- void MycubeInit()
- {
- MyPointNum=8;
- MyPoint[0].x=0,MyPoint[0].y=0,MyPoint[0].z=0,MyPoint[0].tag=1;
- MyPoint[1].x=100,MyPoint[1].y=0,MyPoint[1].z=0,MyPoint[1].tag=1;
- MyPoint[2].x=100,MyPoint[2].y=200,MyPoint[2].z=0,MyPoint[2].tag=1;
- MyPoint[3].x=0,MyPoint[3].y=200,MyPoint[3].z=0,MyPoint[3].tag=1;
-
- MyPoint[4].x=0, MyPoint[4].y=0, MyPoint[4].z=250, MyPoint[4].tag=1;
- MyPoint[5].x=100, MyPoint[5].y=0, MyPoint[5].z=250, MyPoint[5].tag=1;
- MyPoint[6].x=100, MyPoint[6].y=200, MyPoint[6].z=250, MyPoint[6].tag=1;
- MyPoint[7].x=0, MyPoint[7].y=200, MyPoint[7].z=250, MyPoint[7].tag=1;
-
- MyFaceNum=6;
- MyFace[0].push_back(0);MyFace[0].push_back(1);MyFace[0].push_back(2);MyFace[0].push_back(3);
- MyFace[1].push_back(0);MyFace[1].push_back(1);MyFace[1].push_back(5);MyFace[1].push_back(4);
- MyFace[2].push_back(1);MyFace[2].push_back(2);MyFace[2].push_back(6);MyFace[2].push_back(5);
- MyFace[3].push_back(2);MyFace[3].push_back(3);MyFace[3].push_back(7);MyFace[3].push_back(6);
- MyFace[4].push_back(3);MyFace[4].push_back(0);MyFace[4].push_back(4);MyFace[4].push_back(7);
- MyFace[5].push_back(4);MyFace[5].push_back(5);MyFace[5].push_back(6);MyFace[5].push_back(7);
- }
-
- /**************************************************
- *参数:无参数
- *功能:初始化自定义三棱柱
- ***************************************************/
- void MyTriangularPrismInit()
- {
- MyPointNum=6;
- MyPoint[0].x=0, MyPoint[0].y=0, MyPoint[0].z=0, MyPoint[0].tag=1;
- MyPoint[1].x=0, MyPoint[1].y=200, MyPoint[1].z=0, MyPoint[1].tag=1;
- MyPoint[2].x=0, MyPoint[2].y=100, MyPoint[2].z=100, MyPoint[2].tag=1;
-
- MyPoint[3].x=300, MyPoint[3].y=0, MyPoint[3].z=0, MyPoint[3].tag=1;
- MyPoint[4].x=300, MyPoint[4].y=200, MyPoint[4].z=0, MyPoint[4].tag=1;
- MyPoint[5].x=300, MyPoint[5].y=100, MyPoint[5].z=100, MyPoint[5].tag=1;
-
- MyFaceNum=5;
- MyFace[0].push_back(0);MyFace[0].push_back(1);MyFace[0].push_back(2);
- MyFace[1].push_back(0);MyFace[1].push_back(1);MyFace[1].push_back(4);MyFace[1].push_back(3);
- MyFace[3].push_back(1);MyFace[3].push_back(2);MyFace[3].push_back(5);MyFace[3].push_back(4);
- MyFace[4].push_back(2);MyFace[4].push_back(0);MyFace[4].push_back(3);MyFace[4].push_back(5);
- MyFace[5].push_back(3);MyFace[5].push_back(4);MyFace[5].push_back(5);
- }
-
- /**************************************************
- *参数:无参数
- *功能:获得变换后的用户图形的顶点
- ***************************************************/
- void MyTrans(point NewPoint[],point OldPoint[],double Tran[4][4])
- {
- for(int i=0;i<MyPointNum;i++)
- {
- double tx=OldPoint[i].x,ty=OldPoint[i].y,tz=OldPoint[i].z,ttag=OldPoint[i].tag;
- NewPoint[i].x=tx*Tran[0][0]+ty*Tran[1][0]+tz*Tran[2][0]+ttag*Tran[3][0];
- NewPoint[i].y=tx*Tran[0][1]+ty*Tran[1][1]+tz*Tran[2][1]+ttag*Tran[3][1];
- NewPoint[i].z=tx*Tran[0][2]+ty*Tran[1][2]+tz*Tran[2][2]+ttag*Tran[3][2];
- NewPoint[i].tag=tx*Tran[0][3]+ty*Tran[1][3]+tz*Tran[2][3]+ttag*Tran[3][3];
- }
- }
-
- /**************************************************
- *参数:w表示窗口宽,h表示窗口的高
- *功能:重新指定窗口的宽高
- ***************************************************/
- void ChangeSize(int w, int h)
- {
- winWidth=w;winHeight=h;
- glViewport(0,0,w,h);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluOrtho2D(0.0,winWidth,0.0,winHeight);
- }
-
- /**************************************************
- *参数:需绘制图形的顶点
- *功能:绘制指定的图形
- ***************************************************/
- void OnDraw(point TmpPoint[])
- {
- glBegin(GL_LINES);
- for(int i=0;i<MyFaceNum;i++)
- {
- int size=MyFace[i].size();
- for(int j=0;j<size;j++)
- {
- 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);
- }
- }
- glEnd();
- }
-
- /**************************************************
- *参数:无参数
- *功能:绘制三视图的坐标系
- ***************************************************/
- void OnCoordinate()
- {
- glColor3f(1.0f,1.0f,1.0f);
- glBegin(GL_LINES);
-
- glVertex2d(winWidth/2,0); glVertex2d(winWidth/2,winHeight);
- glVertex2d(0,winHeight/2); glVertex2d(winWidth,winHeight/2);
-
- //标记Z轴
- glVertex2d(winWidth/2+5,winHeight-15); glVertex2d(winWidth/2+15,winHeight-15);
- glVertex2d(winWidth/2+5,winHeight-25); glVertex2d(winWidth/2+15,winHeight-15);
- glVertex2d(winWidth/2+5,winHeight-25); glVertex2d(winWidth/2+15,winHeight-25);
-
- glVertex2d(winWidth/2-5,winHeight-5); glVertex2d(winWidth/2,winHeight);
- glVertex2d(winWidth/2+5,winHeight-5); glVertex2d(winWidth/2,winHeight);
-
- //标记Y轴
- glVertex2d(winWidth/2+25,0+15); glVertex2d(winWidth/2+20,0+10);
- glVertex2d(winWidth/2+15,0+15); glVertex2d(winWidth/2+20,0+10);
- glVertex2d(winWidth/2+20,0+10); glVertex2d(winWidth/2+20,0+5);
-
- glVertex2d(winWidth/2-5,0+5); glVertex2d(winWidth/2,0);
- glVertex2d(winWidth/2+5,0+5); glVertex2d(winWidth/2,0);
-
- //标记Y轴
- glVertex2d(0+25,winHeight/2+15); glVertex2d(0+20,winHeight/2+10);
- glVertex2d(0+15,winHeight/2+15); glVertex2d(0+20,winHeight/2+10);
- glVertex2d(0+20,winHeight/2+10); glVertex2d(0+20,winHeight/2+5);
-
- glVertex2d(0+5,winHeight/2+5); glVertex2d(0,winHeight/2);
- glVertex2d(0+5,winHeight/2-5); glVertex2d(0,winHeight/2);
-
- //标记X轴
- glVertex2d(winWidth-25,winHeight/2+15); glVertex2d(winWidth-15,winHeight/2+5);
- glVertex2d(winWidth-25,winHeight/2+5); glVertex2d(winWidth-15,winHeight/2+15);
-
- glVertex2d(winWidth-5,winHeight/2-5); glVertex2d(winWidth,winHeight/2);
- glVertex2d(winWidth-5,winHeight/2+5); glVertex2d(winWidth,winHeight/2);
-
- glEnd();
- }
-
- /**************************************************
- *参数:无参数
- *功能:绘制用户的图形
- ***************************************************/
- void Display()
- {
- glClear(GL_COLOR_BUFFER_BIT);
- OnCoordinate();
- glColor3f(1.0f,1.0f,1.0f);
- glBegin(GL_LINES);
- glVertex2d(winWidth/2,0); glVertex2d(winWidth/2,winHeight);
- glVertex2d(0,winHeight/2); glVertex2d(winWidth,winHeight/2);
- glEnd();
-
- glColor3f(1.0f,0.0f,0.0f);
- OnDraw(XOZPoint);
- glColor3f(0.0f,1.0f,0.0f);
- OnDraw(XOYPoint);
- glColor3f(0.0f,0.0f,1.0f);
- OnDraw(YOZPoint);
- glutSwapBuffers();
- }
-
- /**************************************************
- *参数:无参数
- *功能:三维图形变换主函数
- ***************************************************/
- void GetThreeview()
- {
- MyTrans(XOZPoint,MyPoint,XOZ);
- MyTrans(XOYPoint,MyPoint,XOY);
- MyTrans(YOZPoint,MyPoint,YOZ);
- MyTrans(XOZPoint,XOZPoint,Matrix);
- MyTrans(XOYPoint,XOYPoint,Matrix);
- MyTrans(YOZPoint,YOZPoint,Matrix);
- }
-
- /**************************************************
- *参数:无参数
- *功能:窗口的初始化
- ***************************************************/
- void MyInit()
- {
- for(int i=0;i<10;i++)
- MyFace[i].clear();
- glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
- MycubeInit();
- GetThreeview();
- }
-
- /**************************************************
- *参数:菜单选项
- *功能:菜单响应函数
- ***************************************************/
- void MyMenuProcess(int value)
- {
- for(int i=0;i<10;i++)
- MyFace[i].clear();
- if(1==value)
- MycubeInit();
- if(2==value)
- MyTriangularPrismInit();
- GetThreeview();
- glutPostRedisplay();
- }
-
- int main(int argc, char* argv[])
- {
- glutInit(&argc,argv);
- glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
- glutInitWindowSize(1000,600);
- glutInitWindowPosition(0,0);
- glutCreateWindow("我的三维图形三视图演示程序");
- glutDisplayFunc(Display);
- glutReshapeFunc(ChangeSize);
- glutCreateMenu(MyMenuProcess);
- glutAddMenuEntry("立方体三视图",1);
- glutAddMenuEntry("三棱柱三视图",2);
- glutAttachMenu(GLUT_RIGHT_BUTTON);
- MyInit();
- glutMainLoop();
- return 0;
- }
- //正轴测图改进版.cpp
-
- #include<gl/glut.h>
- #include<windows.h>
- #include<iostream>
- #include<algorithm>
- #include<cmath>
- #include<vector>
- using namespace std;
-
- const int MAXN=200;
- int winWidth=1000,winHeight=600;//窗口宽高
- int MyPointNum=0; //用户图形的顶点数
- double Matrix[4][4]={{1,0,0,0},{0,1,0,0},{0,0,1,0},{500,300,300,1}};//初始化为单位矩阵
- double PI=acos(-1.0);
- double anga=PI/4,angb=PI/4;
- 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}};//正等测图
- struct point
- {
- double x,y,z,tag;
- }MyPoint[MAXN],TPoint[MAXN],Axis[3];//定义图形的顶点
- vector<int>MyFace[10];
- int MyFaceNum=6;
-
- /**************************************************
- *参数:无参数
- *功能:初始化自定义立方体
- ***************************************************/
- void MycubeInit()
- {
- MyPointNum=8;
- MyPoint[0].x=0,MyPoint[0].y=0,MyPoint[0].z=0,MyPoint[0].tag=1;
- MyPoint[1].x=100,MyPoint[1].y=0,MyPoint[1].z=0,MyPoint[1].tag=1;
- MyPoint[2].x=100,MyPoint[2].y=100,MyPoint[2].z=0,MyPoint[2].tag=1;
- MyPoint[3].x=0,MyPoint[3].y=100,MyPoint[3].z=0,MyPoint[3].tag=1;
-
- MyPoint[4].x=0, MyPoint[4].y=0, MyPoint[4].z=250, MyPoint[4].tag=1;
- MyPoint[5].x=100, MyPoint[5].y=0, MyPoint[5].z=250, MyPoint[5].tag=1;
- MyPoint[6].x=100, MyPoint[6].y=100, MyPoint[6].z=250, MyPoint[6].tag=1;
- MyPoint[7].x=0, MyPoint[7].y=100, MyPoint[7].z=250, MyPoint[7].tag=1;
-
- MyFaceNum=6;
- MyFace[0].push_back(0);MyFace[0].push_back(1);MyFace[0].push_back(2);MyFace[0].push_back(3);
- MyFace[1].push_back(0);MyFace[1].push_back(1);MyFace[1].push_back(5);MyFace[1].push_back(4);
- MyFace[2].push_back(1);MyFace[2].push_back(2);MyFace[2].push_back(6);MyFace[2].push_back(5);
- MyFace[3].push_back(2);MyFace[3].push_back(3);MyFace[3].push_back(7);MyFace[3].push_back(6);
- MyFace[4].push_back(3);MyFace[4].push_back(0);MyFace[4].push_back(4);MyFace[4].push_back(7);
- MyFace[5].push_back(4);MyFace[5].push_back(5);MyFace[5].push_back(6);MyFace[5].push_back(7);
-
- Axis[0].x=200,Axis[0].y=0,Axis[0].z=0; Axis[0].tag=1;
- Axis[1].x=0,Axis[1].y=200,Axis[1].z=0; Axis[1].tag=1;
- Axis[2].x=0,Axis[2].y=0,Axis[2].z=300; Axis[2].tag=1;
- }
-
- /**************************************************
- *参数:无参数
- *功能:初始化自定义三棱柱
- ***************************************************/
- void MyTriangularPrismInit()
- {
- MyPointNum=6;
- MyPoint[0].x=0, MyPoint[0].y=0, MyPoint[0].z=0, MyPoint[0].tag=1;
- MyPoint[1].x=0, MyPoint[1].y=200, MyPoint[1].z=0, MyPoint[1].tag=1;
- MyPoint[2].x=0, MyPoint[2].y=100, MyPoint[2].z=100, MyPoint[2].tag=1;
-
- MyPoint[3].x=300, MyPoint[3].y=0, MyPoint[3].z=0, MyPoint[3].tag=1;
- MyPoint[4].x=300, MyPoint[4].y=200, MyPoint[4].z=0, MyPoint[4].tag=1;
- MyPoint[5].x=300, MyPoint[5].y=100, MyPoint[5].z=100, MyPoint[5].tag=1;
-
- MyFaceNum=5;
- MyFace[0].push_back(0);MyFace[0].push_back(1);MyFace[0].push_back(2);
- MyFace[1].push_back(0);MyFace[1].push_back(1);MyFace[1].push_back(4);MyFace[1].push_back(3);
- MyFace[3].push_back(1);MyFace[3].push_back(2);MyFace[3].push_back(5);MyFace[3].push_back(4);
- MyFace[4].push_back(2);MyFace[4].push_back(0);MyFace[4].push_back(3);MyFace[4].push_back(5);
- MyFace[5].push_back(3);MyFace[5].push_back(4);MyFace[5].push_back(5);
-
- Axis[0].x=400,Axis[0].y=0,Axis[0].z=0; Axis[0].tag=1;
- Axis[1].x=0,Axis[1].y=300,Axis[1].z=0; Axis[1].tag=1;
- Axis[2].x=0,Axis[2].y=0,Axis[2].z=200; Axis[2].tag=1;
- }
-
- /**************************************************
- *参数:无参数
- *功能:获得变换后的用户图形的顶点
- ***************************************************/
- void MyTrans(point NewPoint[],point OldPoint[],double Tran[4][4])
- {
- double tx,ty,tz,ttag;
- int i;
- for(i=0;i<MyPointNum;i++)
- {
- tx=OldPoint[i].x,ty=OldPoint[i].y,tz=OldPoint[i].z,ttag=OldPoint[i].tag;
- NewPoint[i].x=tx*Tran[0][0]+ty*Tran[1][0]+tz*Tran[2][0]+ttag*Tran[3][0];
- NewPoint[i].y=tx*Tran[0][1]+ty*Tran[1][1]+tz*Tran[2][1]+ttag*Tran[3][1];
- NewPoint[i].z=tx*Tran[0][2]+ty*Tran[1][2]+tz*Tran[2][2]+ttag*Tran[3][2];
- NewPoint[i].tag=tx*Tran[0][3]+ty*Tran[1][3]+tz*Tran[2][3]+ttag*Tran[3][3];
- }
- for(i=0;i<3;i++)
- {
- tx=Axis[i].x,ty=Axis[i].y,tz=Axis[i].z,ttag=Axis[i].tag;
- Axis[i].x=tx*Tran[0][0]+ty*Tran[1][0]+tz*Tran[2][0]+ttag*Tran[3][0];
- Axis[i].y=tx*Tran[0][1]+ty*Tran[1][1]+tz*Tran[2][1]+ttag*Tran[3][1];
- Axis[i].z=tx*Tran[0][2]+ty*Tran[1][2]+tz*Tran[2][2]+ttag*Tran[3][2];
- Axis[i].tag=tx*Tran[0][3]+ty*Tran[1][3]+tz*Tran[2][3]+ttag*Tran[3][3];
- }
- }
-
- /**************************************************
- *参数:w表示窗口宽,h表示窗口的高
- *功能:重新指定窗口的宽高
- ***************************************************/
- void ChangeSize(int w, int h)
- {
- winWidth=w;winHeight=h;
- glViewport(0,0,w,h);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluOrtho2D(0.0,winWidth,0.0,winHeight);
- }
-
- /**************************************************
- *参数:需绘制图形的顶点
- *功能:绘制变换后的图形
- ***************************************************/
- void OnDraw(point TmpPoint[])
- {
- glColor3f(0.0f,1.0f,0.0f);
- glBegin(GL_LINES);
- for(int i=0;i<MyFaceNum;i++)
- {
- int size=MyFace[i].size();
- for(int j=0;j<size;j++)
- {
- 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);
- }
- }
- glEnd();
- }
-
- /**************************************************
- *参数:无参数
- *功能:绘制三视图的坐标系
- ***************************************************/
- void OnCoordinate(point TmpPoint[])
- {
- glColor3f(1.0f,1.0f,1.0f);
- glBegin(GL_LINES);
- glVertex2d(500,300); glVertex2d(Axis[2].x,Axis[2].y); //Z轴
- glVertex2d(Axis[2].x+5,Axis[2].y-15); glVertex2d(Axis[2].x+15,Axis[2].y-15);
- glVertex2d(Axis[2].x+5,Axis[2].y-25); glVertex2d(Axis[2].x+15,Axis[2].y-15);
- glVertex2d(Axis[2].x+5,Axis[2].y-25); glVertex2d(Axis[2].x+15,Axis[2].y-25);
- glVertex2d(Axis[2].x-5,Axis[2].y-5); glVertex2d(Axis[2].x,Axis[2].y);
- glVertex2d(Axis[2].x+5,Axis[2].y-5); glVertex2d(Axis[2].x,Axis[2].y);
- glVertex2d(500,300); glVertex2d(Axis[1].x,Axis[1].y); //Y轴
- glVertex2d(Axis[1].x-35,Axis[1].y+15); glVertex2d(Axis[1].x-30,Axis[1].y+10);
- glVertex2d(Axis[1].x-25,Axis[1].y+15); glVertex2d(Axis[1].x-30,Axis[1].y+10);
- glVertex2d(Axis[1].x-30,Axis[1].y+5); glVertex2d(Axis[1].x-30,Axis[1].y+10);
- glVertex2d(Axis[1].x-5,Axis[1].y-5); glVertex2d(Axis[1].x,Axis[1].y);
- glVertex2d(Axis[1].x-5,Axis[1].y+5); glVertex2d(Axis[1].x,Axis[1].y);
- glVertex2d(500,300); glVertex2d(Axis[0].x,Axis[0].y); //X轴
- glVertex2d(Axis[0].x+15,Axis[0].y+25); glVertex2d(Axis[0].x+25,Axis[0].y+15);
- glVertex2d(Axis[0].x+15,Axis[0].y+15); glVertex2d(Axis[0].x+25,Axis[0].y+25);
- glVertex2d(Axis[0].x+5,Axis[0].y-5); glVertex2d(Axis[0].x,Axis[0].y);
- glVertex2d(Axis[0].x+5,Axis[0].y+5); glVertex2d(Axis[0].x,Axis[0].y);
- glEnd();
- }
-
- /**************************************************
- *参数:无参数
- *功能:三维图形变换主函数
- ***************************************************/
- void GetProcess()
- {
- MycubeInit();
- // MyTriangularPrismInit();
- MyTrans(TPoint,MyPoint,Change);
- MyTrans(TPoint,TPoint,Matrix);
- }
-
- /**************************************************
- *参数:无参数
- *功能:绘制用户的图形
- ***************************************************/
- void Display()
- {
- glClear(GL_COLOR_BUFFER_BIT);
- GetProcess();
- OnDraw(TPoint);
- OnCoordinate(TPoint);
- glutSwapBuffers();
- }
-
- /**************************************************
- *参数:无参数
- *功能:窗口的初始化
- ***************************************************/
- void MyInit()
- {
- glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
- for(int i=0;i<10;i++)
- MyFace[i].clear();
- MycubeInit();
- // MyTriangularPrismInit();
- anga=PI/4,angb=PI/6;
- }
-
- /**************************************************
- *参数:按键类型等
- *功能:键盘响应函数
- ***************************************************/
- void SpecialKeys(int key,int x,int y)
- {
- if(key==GLUT_KEY_UP)
- anga+=PI/180;
- if(key==GLUT_KEY_DOWN)
- anga-=PI/180;
- if(key==GLUT_KEY_LEFT)
- angb+=PI/180;
- if(key==GLUT_KEY_RIGHT)
- angb-=PI/180;
- double Sina=sin(anga), Cosa=cos(anga), Sinb=sin(angb), Cosb=cos(angb);
- Change[0][0]=Cosa, Change[0][1]=-Sina*Sinb, Change[0][2]=Sina*Cosb;
- Change[1][0]=0, Change[1][1]=Cosb, Change[1][2]=Sinb;
- Change[2][0]=-Sina, Change[2][1]= -Cosa*Sinb, Change[2][2]=Cosa*Cosb;
- Display();
- }
-
- int main(int argc, char* argv[])
- {
- glutInit(&argc,argv);
- glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
- glutInitWindowSize(1000,600);
- glutInitWindowPosition(0,0);
- glutCreateWindow("我的三维图形——立方体正轴测图演示程序");
- glutDisplayFunc(Display);
- glutReshapeFunc(ChangeSize);
- glutSpecialFunc(SpecialKeys);
- MyInit();
- glutMainLoop();
- return 0;
- }
- //消隐算法—深度缓冲器算法改进版.cpp
- #include<gl/glut.h>
- #include<windows.h>
- #include<iostream>
- #include<algorithm>
- #include<cmath>
- #include<vector>
- using namespace std;
-
- const int MAXN=200;
- const int INF=1<<30;
- const double eps=1e-10;
- int winWidth=1000,winHeight=600;//窗口宽高
- int MyPointNum=0; //用户图形的顶点数
- double PI=acos(-1.0);
- double anga=PI/4,angb=PI/6;;
- double Matrix[4][4]={{1,0,0,0},{0,1,0,0},{0,0,1,0},{500,300,300,1}};//初始化为单位矩阵
- double Chang[4][4]={{1,0,0,0},{0,1,0,0},{0,0,1,0},{0,0,0,1}};//各种基本变换矩阵;
- double Touying[4][4]={{1,0,0,0},{0,1,0,0},{0,0,0,0},{0,0,0,1}};//投影到XOY平面矩阵
- vector<int>MyFace[10];//存放面与顶点的拓扑信息
- int MyFaceNum=0;
- struct point
- {
- double x,y,z,tag;
- }MyPoint[MAXN],ProcessPoint[MAXN],ResultPoint[MAXN];//定义图形的顶点
- struct piexl
- {
- int color;
- double deepth;
- }MyPiexl[1024][10240];//存放屏幕像素点的深度与颜色
-
- /**************************************************
- *参数:前四个参数指定平面上的三个顶点,后面为某点的x,y坐标
- *功能:计算深度
- ***************************************************/
- double GetZ(point TmpPoint[],int id1,int id2,int id3,double x,double y)
- {
- double x2_x1=TmpPoint[id2].x-TmpPoint[id1].x;
- double x3_x1=TmpPoint[id3].x-TmpPoint[id1].x;
-
- double y2_y1=TmpPoint[id2].y-TmpPoint[id1].y;
- double y3_y1=TmpPoint[id3].y-TmpPoint[id1].y;
-
- double Z2_Z1=TmpPoint[id2].z-TmpPoint[id1].z;
- double Z3_Z1=TmpPoint[id3].z-TmpPoint[id1].z;
-
- 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))
- -Z3_Z1*x2_x1*(y-TmpPoint[id1].y);
- if((y2_y1*x3_x1-x2_x1*y3_y1)==0)
- return -INF;//投影成一条线
- return (tmp+TmpPoint[id1].z*(y2_y1*x3_x1-x2_x1*y3_y1))/(y2_y1*x3_x1-x2_x1*y3_y1);
- }
-
- /*******************************************************
- *参数:无参数
- *功能:深度缓冲器算法的具体实现
- ********************************************************/
- void XiaoYin(point TmpPoint[],int id)
- {
- int size=MyFace[id].size();
- int MinY=INF,MaxY=-INF;
- for(int i=0;i<size;i++)
- {
- if(TmpPoint[MyFace[id][i]].y>MaxY)
- MaxY=TmpPoint[MyFace[id][i]].y;
- if(TmpPoint[MyFace[id][i]].y<MinY)
- MinY=TmpPoint[MyFace[id][i]].y;
- }
- for(int y=MinY;y<=MaxY;y++)
- {
- vector<int>Vec;
- for(int i=0;i<size;i++)
- {
- if(TmpPoint[MyFace[id][i]].y==y)
- {
- Vec.push_back(TmpPoint[MyFace[id][i]].x);
- 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)
- {
- Vec.push_back(TmpPoint[MyFace[id][i]].x);
- }
- }
- 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)
- {
- 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)
- /(TmpPoint[MyFace[id][(i+1)%size]].y-TmpPoint[MyFace[id][i]].y);//此处暂直接取整
- Vec.push_back(x);
- }
- }
- sort(Vec.begin(),Vec.end());
- int tmpsize=Vec.size();
- for(int i=0;i<tmpsize;i+=2)
- {
- for(int j=Vec[i];j<=Vec[i+1];j++)
- {
- double tmpz=GetZ(TmpPoint,MyFace[id][0],MyFace[id][1],MyFace[id][2],j,y);
- if(tmpz>MyPiexl[j][y].deepth)
- {
- MyPiexl[j][y].deepth=tmpz,MyPiexl[j][y].color=id;
- }
- }
- }
- }
- }
-
- /**************************************************
- *参数:无参数
- *功能:初始化每个像素
- ***************************************************/
- void PiexInit()
- {
- for(int i=0;i<1000;i++)
- {
- for(int j=0;j<600;j++)
- {
- MyPiexl[i][j].color=-1;
- MyPiexl[i][j].deepth=-INF;
- }
- }
- }
-
- /**************************************************
- *参数:无参数
- *功能:初始化自定义立方体
- ***************************************************/
- void MycubeInit()
- {
- MyPointNum=8;
- MyPoint[0].x=0,MyPoint[0].y=0,MyPoint[0].z=0,MyPoint[0].tag=1;
- MyPoint[1].x=100,MyPoint[1].y=0,MyPoint[1].z=0,MyPoint[1].tag=1;
- MyPoint[2].x=100,MyPoint[2].y=100,MyPoint[2].z=0,MyPoint[2].tag=1;
- MyPoint[3].x=0,MyPoint[3].y=100,MyPoint[3].z=0,MyPoint[3].tag=1;
-
- MyPoint[4].x=0, MyPoint[4].y=0, MyPoint[4].z=250, MyPoint[4].tag=1;
- MyPoint[5].x=100, MyPoint[5].y=0, MyPoint[5].z=250, MyPoint[5].tag=1;
- MyPoint[6].x=100, MyPoint[6].y=100, MyPoint[6].z=250, MyPoint[6].tag=1;
- MyPoint[7].x=0, MyPoint[7].y=100, MyPoint[7].z=250, MyPoint[7].tag=1;
-
- MyFaceNum=6;
- MyFace[0].push_back(0);MyFace[0].push_back(1);MyFace[0].push_back(2);MyFace[0].push_back(3);
- MyFace[1].push_back(0);MyFace[1].push_back(1);MyFace[1].push_back(5);MyFace[1].push_back(4);
- MyFace[2].push_back(1);MyFace[2].push_back(2);MyFace[2].push_back(6);MyFace[2].push_back(5);
- MyFace[3].push_back(2);MyFace[3].push_back(3);MyFace[3].push_back(7);MyFace[3].push_back(6);
- MyFace[4].push_back(3);MyFace[4].push_back(0);MyFace[4].push_back(4);MyFace[4].push_back(7);
- MyFace[5].push_back(4);MyFace[5].push_back(5);MyFace[5].push_back(6);MyFace[5].push_back(7);
-
- }
-
- /**************************************************
- *参数:无参数
- *功能:初始化自定义三棱柱
- ***************************************************/
- void MyTriangularPrismInit()
- {
- MyPointNum=6;
- MyPoint[0].x=0, MyPoint[0].y=0, MyPoint[0].z=0, MyPoint[0].tag=1;
- MyPoint[1].x=0, MyPoint[1].y=200, MyPoint[1].z=0, MyPoint[1].tag=1;
- MyPoint[2].x=0, MyPoint[2].y=100, MyPoint[2].z=100, MyPoint[2].tag=1;
-
- MyPoint[3].x=300, MyPoint[3].y=0, MyPoint[3].z=0, MyPoint[3].tag=1;
- MyPoint[4].x=300, MyPoint[4].y=200, MyPoint[4].z=0, MyPoint[4].tag=1;
- MyPoint[5].x=300, MyPoint[5].y=100, MyPoint[5].z=100, MyPoint[5].tag=1;
-
- MyFaceNum=6;
- MyFace[0].push_back(0);MyFace[0].push_back(1);MyFace[0].push_back(2);
- MyFace[1].push_back(0);MyFace[1].push_back(1);MyFace[1].push_back(4);MyFace[1].push_back(3);
- MyFace[3].push_back(1);MyFace[3].push_back(2);MyFace[3].push_back(5);MyFace[3].push_back(4);
- MyFace[4].push_back(2);MyFace[4].push_back(0);MyFace[4].push_back(3);MyFace[4].push_back(5);
- MyFace[5].push_back(3);MyFace[5].push_back(4);MyFace[5].push_back(5);
- }
- /**************************************************
- *参数:OldPoint,Tran[4][4],NewPoint分别表示变换前顶点信息、变换矩阵、变换后顶点信息
- *功能:获得变换后的用户图形的顶点
- ***************************************************/
- void MyTrans(point NewPoint[],point OldPoint[],double Tran[4][4])
- {
- double tx,ty,tz,ttag;
- for(int i=0;i<MyPointNum;i++)
- {
- tx=OldPoint[i].x,ty=OldPoint[i].y,tz=OldPoint[i].z,ttag=OldPoint[i].tag;
- NewPoint[i].x=tx*Tran[0][0]+ty*Tran[1][0]+tz*Tran[2][0]+ttag*Tran[3][0];
- NewPoint[i].y=tx*Tran[0][1]+ty*Tran[1][1]+tz*Tran[2][1]+ttag*Tran[3][1];
- NewPoint[i].z=tx*Tran[0][2]+ty*Tran[1][2]+tz*Tran[2][2]+ttag*Tran[3][2];
- NewPoint[i].tag=tx*Tran[0][3]+ty*Tran[1][3]+tz*Tran[2][3]+ttag*Tran[3][3];
- }
- }
-
- /**************************************************
- *参数:TmpPoint表示需绘制图形的顶点
- *功能:绘制指定的图形
- ***************************************************/
- void OnDraw(point TmpPoint[])
- {
- glBegin(GL_POINTS);
- for(int i=0;i<1000;i++)
- {
- for(int j=0;j<600;j++)
- {
- switch(MyPiexl[i][j].color)
- {
- case 0:glColor3f(1.0f,0.0f,0.0f);break;
- case 1:glColor3f(0.0f,1.0f,0.0f);break;
- case 2:glColor3f(0.0f,0.0f,1.0f);break;
- case 3:glColor3f(1.0f,1.0f,0.0f);break;
- case 4:glColor3f(1.0f,0.0f,1.0f);break;
- case 5:glColor3f(0.0f,1.0f,1.0f);break;
- default:glColor3f(0.0f,0.0f,0.0f);break;
- }
- glVertex2i(i,j);
- }
- }
- glEnd();
- }
-
- /**************************************************
- *参数:无参数
- *功能:绘制用户的图形
- ***************************************************/
- void Display()
- {
- glClear(GL_COLOR_BUFFER_BIT);
- OnDraw(ResultPoint);
- glutSwapBuffers();
- }
-
- /**************************************************
- *参数:无参数
- *功能:三维图形变换的主函数
- ***************************************************/
- void GetProcess()
- {
- PiexInit();
- MyTrans(ProcessPoint,MyPoint,Chang);//几何变换
- MyTrans(ResultPoint,ProcessPoint,Matrix);//平移
- for(int i=0;i<MyFaceNum;i++)//依次计算所有面
- XiaoYin(ResultPoint,i);
- MyTrans(ResultPoint,ResultPoint,Touying);//投影
- }
-
- /**************************************************
- *参数:无参数
- *功能:窗口的初始化
- ***************************************************/
- void MyInit()
- {
- glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
- MyTriangularPrismInit();
- anga=PI/4;angb=PI/6;
- GetProcess();
- }
-
- /**************************************************
- *参数:w表示窗口宽,h表示窗口的高
- *功能:重新指定窗口的宽高
- ***************************************************/
- void ChangeSize(int w, int h)
- {
- winWidth=w;winHeight=h;
- glViewport(0,0,w,h);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluOrtho2D(0.0,winWidth,0.0,winHeight);
- }
-
- /**************************************************
- *参数:键盘按键类型等
- *功能:键盘响应函数
- ***************************************************/
- void MyKeyPcocess(int key,int x,int y)
- {
- if(key==GLUT_KEY_UP)
- anga+=PI/180;
- if(key==GLUT_KEY_DOWN)
- anga-=PI/180;
- if(key==GLUT_KEY_LEFT)
- angb+=PI/180;
- if(key==GLUT_KEY_RIGHT)
- angb-=PI/180;
- double Sina=sin(anga), Cosa=cos(anga), Sinb=sin(angb), Cosb=cos(angb);
- Chang[0][0]=Cosa, Chang[0][1]=-Sina*Sinb, Chang[0][2]=Sina*Cosb;
- Chang[1][0]=0, Chang[1][1]=Cosb, Chang[1][2]=Sinb;
- Chang[2][0]=-Sina, Chang[2][1]= -Cosa*Sinb, Chang[2][2]=Cosa*Cosb;
- GetProcess();
- Display();
- }
-
- /**************************************************
- *参数:菜单选项
- *功能:菜单响应函数
- ***************************************************/
- void MyMenuProcess(int value)
- {
- for(int i=0;i<10;i++)
- MyFace[i].clear();
- if(1==value)
- MycubeInit();
- if(2==value)
- MyTriangularPrismInit();
- GetProcess();
- glutPostRedisplay();
- }
-
-
- int main(int argc, char* argv[])
- {
- glutInit(&argc,argv);
- glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
- glutInitWindowSize(1000,600);
- glutInitWindowPosition(0,0);
- glutCreateWindow("我的三维图形消隐---深度缓冲器算法演示程序");
- glutDisplayFunc(Display);
- glutReshapeFunc(ChangeSize);
- glutSpecialFunc(MyKeyPcocess);
- glutCreateMenu(MyMenuProcess);
- glutAddMenuEntry("长方体",1);
- glutAddMenuEntry("三棱柱",2);
- glutAttachMenu(GLUT_RIGHT_BUTTON);
- MyInit();
- glutMainLoop();
- return 0;
- }
-
以下是运行结果截图
|