OPENGL绘制复杂多边形

#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;

}

附上效果图:


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值