#include "stdafx.h"
#include <math.h>
#include <gl/glut.h>
#include <gl/glext.h>
#define PI_ 3.14159265358979323846
GLuint theTorus;
GLuint theVector;
/* Draw a torus */
static void torus(int numc, int numt)
{
int i, j, k;
double s, t, x, y, z, twopi;
twopi = 2 * PI_;
glBegin(GL_QUAD_STRIP);
for (j = 0; j <= numt; j++)
{
double s1 = 2.5;
double s2 = 1.5;
t = j % numt;
double x1 = (1+.1*cos(s1*twopi/numc))*cos(t*twopi/numt);
double y1 = (1+.1*cos(s1*twopi/numc))*sin(t*twopi/numt);
double x2 = (2+.1*cos(s2*twopi/numc))*cos(t*twopi/numt);
double y2 = (2+.1*cos(s2*twopi/numc))*sin(t*twopi/numt);
glVertex2f(x1, y1);
glVertex2f(x2, y2);
}
glEnd();
}
///
// GLU_TESS CALLBACKS
///
void CALLBACK tessBeginCB(GLenum which)
{
glBegin(which);
}
void CALLBACK tessEndCB()
{
glEnd();
}
void CALLBACK tessVertexCB(const GLvoid *data)
{
// cast back to double type
const GLdouble *ptr = (const GLdouble*)data;
glVertex3dv(ptr);
}
void CALLBACK tessErrorCB(GLenum errorCode)
{
const GLubyte *errorStr;
errorStr = gluErrorString(errorCode);
}
/* Draw a vcector */
static void drawVector()
{
GLUtesselator *tess = gluNewTess(); // create a tessellator
if(!tess) return ; // failed to create tessellation object, return 0
// define concave quad with a hole
// 0--------3
// | 4----7 |
// | | | |
// | 5----6 |
// 1--------2
GLdouble quad2[16][3] = { {-2,3,0}, {-2,0,0}, {3,0,0}, { 3,3,0},
{-1,2,0}, {-1,1,0}, {1,1,0}, { 1,2,0},{2,2,0},{2,1,0},{2.5,1,0},{2.5,2,0},{-0.5,2,0},{-0.5,1,0},{0,1,0},{0,2,0} };
// register callback functions
gluTessCallback(tess, GLU_TESS_BEGIN, (void (__stdcall*)(void))tessBeginCB);
gluTessCallback(tess, GLU_TESS_END, (void (__stdcall*)(void))tessEndCB);
gluTessCallback(tess, GLU_TESS_ERROR, (void (__stdcall*)(void))tessErrorCB);
gluTessCallback(tess, GLU_TESS_VERTEX, (void (__stdcall*)())tessVertexCB);
// tessellate and compile a concave quad into display list
//glNewList(id, GL_COMPILE);
glColor3f(1,0,1);
gluTessBeginPolygon(tess, 0); // with NULL data
gluTessBeginContour(tess); // outer quad
gluTessVertex(tess, quad2[0], quad2[0]);
gluTessVertex(tess, quad2[1], quad2[1]);
gluTessVertex(tess, quad2[2], quad2[2]);
gluTessVertex(tess, quad2[3], quad2[3]);
gluTessEndContour(tess);
gluTessBeginContour(tess); // inner quad (hole)
gluTessVertex(tess, quad2[4], quad2[4]);
gluTessVertex(tess, quad2[5], quad2[5]);
gluTessVertex(tess, quad2[6], quad2[6]);
gluTessVertex(tess, quad2[7], quad2[7]);
gluTessEndContour(tess);
gluTessBeginContour(tess); // inner quad (hole)
gluTessVertex(tess, quad2[8], quad2[8]);
gluTessVertex(tess, quad2[9], quad2[9]);
gluTessVertex(tess, quad2[10], quad2[10]);
gluTessVertex(tess, quad2[11], quad2[11]);
gluTessEndContour(tess);
gluTessBeginContour(tess); // inner quad (hole)
gluTessVertex(tess, quad2[12], quad2[12]);
gluTessVertex(tess, quad2[13], quad2[13]);
gluTessVertex(tess, quad2[14], quad2[14]);
gluTessVertex(tess, quad2[15], quad2[15]);
gluTessEndContour(tess);
gluTessEndPolygon(tess);
//glEndList();
gluDeleteTess(tess); // delete after tessellation
}
/* Create display list with Torus and initialize state */
static void init(void)
{
theTorus = glGenLists (1);
glNewList(theTorus, GL_COMPILE);
//torus(3, 8);
drawVector();
glEndList();
glShadeModel(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, 1.0, 1.0);
glCallList(theTorus);
glFlush();
glutSwapBuffers();
}
/* 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 "x" 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_DOUBLE | GLUT_RGB);
glutCreateWindow(argv[0]);
init();
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboard);
glutDisplayFunc(display);
glutMainLoop();
return 0;
#include <math.h>
#include <gl/glut.h>
#include <gl/glext.h>
#define PI_ 3.14159265358979323846
GLuint theTorus;
GLuint theVector;
/* Draw a torus */
static void torus(int numc, int numt)
{
int i, j, k;
double s, t, x, y, z, twopi;
twopi = 2 * PI_;
glBegin(GL_QUAD_STRIP);
for (j = 0; j <= numt; j++)
{
double s1 = 2.5;
double s2 = 1.5;
t = j % numt;
double x1 = (1+.1*cos(s1*twopi/numc))*cos(t*twopi/numt);
double y1 = (1+.1*cos(s1*twopi/numc))*sin(t*twopi/numt);
double x2 = (2+.1*cos(s2*twopi/numc))*cos(t*twopi/numt);
double y2 = (2+.1*cos(s2*twopi/numc))*sin(t*twopi/numt);
glVertex2f(x1, y1);
glVertex2f(x2, y2);
}
glEnd();
}
///
// GLU_TESS CALLBACKS
///
void CALLBACK tessBeginCB(GLenum which)
{
glBegin(which);
}
void CALLBACK tessEndCB()
{
glEnd();
}
void CALLBACK tessVertexCB(const GLvoid *data)
{
// cast back to double type
const GLdouble *ptr = (const GLdouble*)data;
glVertex3dv(ptr);
}
void CALLBACK tessErrorCB(GLenum errorCode)
{
const GLubyte *errorStr;
errorStr = gluErrorString(errorCode);
}
/* Draw a vcector */
static void drawVector()
{
GLUtesselator *tess = gluNewTess(); // create a tessellator
if(!tess) return ; // failed to create tessellation object, return 0
// define concave quad with a hole
// 0--------3
// | 4----7 |
// | | | |
// | 5----6 |
// 1--------2
GLdouble quad2[16][3] = { {-2,3,0}, {-2,0,0}, {3,0,0}, { 3,3,0},
{-1,2,0}, {-1,1,0}, {1,1,0}, { 1,2,0},{2,2,0},{2,1,0},{2.5,1,0},{2.5,2,0},{-0.5,2,0},{-0.5,1,0},{0,1,0},{0,2,0} };
// register callback functions
gluTessCallback(tess, GLU_TESS_BEGIN, (void (__stdcall*)(void))tessBeginCB);
gluTessCallback(tess, GLU_TESS_END, (void (__stdcall*)(void))tessEndCB);
gluTessCallback(tess, GLU_TESS_ERROR, (void (__stdcall*)(void))tessErrorCB);
gluTessCallback(tess, GLU_TESS_VERTEX, (void (__stdcall*)())tessVertexCB);
// tessellate and compile a concave quad into display list
//glNewList(id, GL_COMPILE);
glColor3f(1,0,1);
gluTessBeginPolygon(tess, 0); // with NULL data
gluTessBeginContour(tess); // outer quad
gluTessVertex(tess, quad2[0], quad2[0]);
gluTessVertex(tess, quad2[1], quad2[1]);
gluTessVertex(tess, quad2[2], quad2[2]);
gluTessVertex(tess, quad2[3], quad2[3]);
gluTessEndContour(tess);
gluTessBeginContour(tess); // inner quad (hole)
gluTessVertex(tess, quad2[4], quad2[4]);
gluTessVertex(tess, quad2[5], quad2[5]);
gluTessVertex(tess, quad2[6], quad2[6]);
gluTessVertex(tess, quad2[7], quad2[7]);
gluTessEndContour(tess);
gluTessBeginContour(tess); // inner quad (hole)
gluTessVertex(tess, quad2[8], quad2[8]);
gluTessVertex(tess, quad2[9], quad2[9]);
gluTessVertex(tess, quad2[10], quad2[10]);
gluTessVertex(tess, quad2[11], quad2[11]);
gluTessEndContour(tess);
gluTessBeginContour(tess); // inner quad (hole)
gluTessVertex(tess, quad2[12], quad2[12]);
gluTessVertex(tess, quad2[13], quad2[13]);
gluTessVertex(tess, quad2[14], quad2[14]);
gluTessVertex(tess, quad2[15], quad2[15]);
gluTessEndContour(tess);
gluTessEndPolygon(tess);
//glEndList();
gluDeleteTess(tess); // delete after tessellation
}
/* Create display list with Torus and initialize state */
static void init(void)
{
theTorus = glGenLists (1);
glNewList(theTorus, GL_COMPILE);
//torus(3, 8);
drawVector();
glEndList();
glShadeModel(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, 1.0, 1.0);
glCallList(theTorus);
glFlush();
glutSwapBuffers();
}
/* 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 "x" 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_DOUBLE | GLUT_RGB);
glutCreateWindow(argv[0]);
init();
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboard);
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
附上效果图: