生成的結果如下,初學者,只是使用了一些基礎的函數:
代碼如下:
#include<iostream>
#include<math.h>
using namespace std;
#include<gl/glut.h>
//莫比烏斯環座標生成宏
#define MobiusX(u,v) ((1+(v)*cos((u)/2)/2)*cos(u))
#define MobiusY(u,v) ((1+(v)*cos((u)/2)/2)*sin(u))
#define MobiusZ(u,v) ((v)*sin((u)/2)/2)
const int P1 = 8, P2 = 8;
const double PI = 3.1415926;//圓周率pi
//儲存繪製點座標
GLfloat CP0[P1][P2][3];//點座標數組
GLfloat light_ambient[] = { 0.2,0.2,0.2,1.0 };//環境光
GLfloat light_diffuse[] = { 0.54f,0.168f,0.886f,0 };//散射光
GLfloat light_specular[] = { 1.0,1.0,1.0,0.0 };//鏡面光
GLfloat light0_position[] = { 0,0,0,1 };//0號光源位置
GLfloat light1_position[] = { -1,0,0,1 };//1號光源位置
//莫比烏斯環函數聲明
void disinit();//顯示初始化
void displayFace();//繪製圖形
void reshap(GLsizei w, GLsizei h);//窗口修正
int mobius(int argc, char* argv[]);//莫比烏斯環生成函數
int main(int argc, char* argv[])
{
mobius(argc,argv);
return 0;
}
int mobius(int argc, char* argv[])
{
glutInit(&argc, argv);//初始化glut庫
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);//設置:雙緩存,RGB,深度緩衝
glutInitWindowPosition(0, 0);//設置窗口顯示的位置
glutInitWindowSize(800, 600);//設置窗口大小
glutCreateWindow("莫比烏斯環");//創建創建窗口,設置標題
//窗口控制
disinit();//初始化
glutReshapeFunc(reshap);//重塑函數
glutDisplayFunc(displayFace);//繪製函數
//主循環
glutMainLoop();
return 0;
}
void disinit()
{
//座標初始化
int i, j;
GLfloat t1 = (GLfloat)2 * PI / (P1 - 1), t2 = (GLfloat)2 / (P2 - 1), u = 0, v = -1, b = 2;//b用來控制圖形的絕對大小
for (i = 0; i < P1; ++i) {
for (j = 0; j < P2; ++j) {
CP0[i][j][0] = MobiusX(u + t1 * i, v + t2 * j)/b;
CP0[i][j][1] = MobiusY(u + t1 * i, v + t2 * j)/b ;
CP0[i][j][2] = MobiusZ(u + t1 * i, v + t2 * j)/b ;
cout << "x=" << CP0[i][j][0];
cout << ",y=" << CP0[i][j][1];
cout << ",z=" << CP0[i][j][2] << endl;//打印每個點的座標
}
}
glClearColor(0, 0, 0, 0);//黑色背景
//設置0號光源
glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
glLightfv(GL_LIGHT0, GL_POSITION, light0_position);
//設置1號光源
glLightfv(GL_LIGHT1, GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT1, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT1, GL_SPECULAR, light_specular);
glLightfv(GL_LIGHT1, GL_POSITION, light1_position);
glEnable(GL_LIGHTING);//使用光照
glEnable(GL_LIGHT0);//開啓0號光源
glEnable(GL_LIGHT1);//開啓1號光源
//讓圖形可以反射光
glEnable(GL_AUTO_NORMAL);
//啓用深度測試
glEnable(GL_DEPTH_TEST);
}
void displayFace()//繪製圖形
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//清除顏色緩存和深度緩存
glRotatef(70, 1, 0, 0);//旋轉70度
//繪製曲面
glEnable(GL_LINE_SMOOTH);//平滑線段
glEnable(GL_MAP2_VERTEX_3);//激活函數glMap2
//曲面求值函數
glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, P1, 0, 1, 3*P2, P2, &CP0[0][0][0]);
//生成均勻分佈的參數
glMapGrid2f(20, 0.0, 1, 20, 0.0, 1);
//繪製
glEvalMesh2(GL_FILL, 0, 20, 0, 20);
//從緩衝區加載圖形
glutSwapBuffers();
}
void reshap(GLsizei w, GLsizei h)//窗口修正
{
glViewport(0, 0, w, h);//根據窗口變化實時重繪窗口
}