opengl圆环的绘制

来源:互联网 发布:淘宝上宝贝的视频教程 编辑:程序博客网 时间:2024/04/29 02:42
#include "stdafx.h"
#include <GL/glut.h>  
#include <stdio.h>  
#include <math.h>  
#include <stdlib.h>  
  
#define PI_ 3.14159265358979323846  
  
GLuint theTorus;  
  
/* Draw a torus */  
static void torus(int numc, int numt)  
{  
   int i, j, k;  
   double s, t, x, y, z, twopi;  
  
   twopi = 2 * PI_;  
   for (i = 0; i < numc; i++) {  
      glBegin(GL_QUAD_STRIP);  
      for (j = 0; j <= numt; j++) {  
         for (k = 1; k >= 0; k--) {  
            s = (i + k) % numc + 0.5;  
            t = j % numt;  
  
            x = (1+.1*cos(s*twopi/numc))*cos(t*twopi/numt);  
            y = (1+.1*cos(s*twopi/numc))*sin(t*twopi/numt);//圆环的公式  
            z = .1 * sin(s * twopi / numc);  
            glVertex3f(x, y, z);  
         }  
      }  
      glEnd();  
   }  
}  
  
/* Create display list with Torus and initialize state */  
static void init(void)  
{  
   theTorus = glGenLists (1);  //建立显示列表空间
   glNewList(theTorus, GL_COMPILE);  //创建一个显示列表
   torus(8, 25);  
   glEndList();  //现实列表完成
  
   glShadeModel(GL_FLAT);  //设置着色模式,GL_FLAT表示采用恒定着色,使用图元中某个顶点的颜色来渲染整个图元。
   glClearColor(0.0, 0.0, 0.0, 0.0);  
}  
  
/* Clear window and draw torus */  
void display(void)  
{  
   glClear(GL_COLOR_BUFFER_BIT);  
   glColor3f (1.0, 0.0, 0.0);  
   glCallList(theTorus);  //执行显示列表
   glFlush();  
}  
  
/* Handle window resize */  
void reshape(int w, int h)  
{  
   glViewport(0, 0, (GLsizei) w, (GLsizei) h);  
   glMatrixMode(GL_PROJECTION);  
   glLoadIdentity();  
   gluPerspective(30, (GLfloat) w/(GLfloat) h, 1.0, 100.0);  //透视投影
   glMatrixMode(GL_MODELVIEW);  
   glLoadIdentity();  
   gluLookAt(0, 0, 10, 0, 0, 0, 0, 1, 0);  
}  
  
/* Rotate about x-axis when "yx" typed; rotate about y-axis 
   when "y" typed; "i" returns torus to original view */  
void keyboard(unsigned char key, int x, int y)  
{  
   switch (key) {  
   case 'x':  
   case 'X':  
      glRotatef(30.,1.0,0.0,0.0);  
      glutPostRedisplay();  //重绘窗口
      break;  
   case 'y':  
   case 'Y':  
      glRotatef(30.,0.0,1.0,0.0);  
      glutPostRedisplay();  
      break;  
   case 'i':  
   case 'I':  
      glLoadIdentity();  
      gluLookAt(0, 0, 10, 0, 0, 0, 0, 1, 0);  
      glutPostRedisplay();  
      break;  
   case 27:  
      exit(0);  
      break;  
   }  
}  
  
int main(int argc, char **argv)  
{  
   glutInitWindowSize(200, 200);  
   glutInit(&argc, argv);  
   glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);  
   glutCreateWindow("yuanhuan");  
   init();  
   glutReshapeFunc(reshape);  
   glutKeyboardFunc(keyboard);  
   glutDisplayFunc(display);  
   glutMainLoop();  
   return 0;  

}