在OpenGL中实现缠绕规则

时间:2011-11-24 17:59:14

标签: c opengl

我有这样的代码,用户在OpenGL中使用鼠标指针绘制一些多边形。在绘制完之后,我想要求用户填充多边形,然后实现缠绕规则,以判断多边形是从多边形的内部还是外部填充。谁能告诉我如何实现这一目标?

#include <cstdlib>
#include <iostream>
#include<GL/glut.h>
GLsizei winWidth=400,winHeight=300;
GLint endPtCtr=0;
using namespace std;

class scrPt
{
public:
    GLint x,y;
};
void init(void)
{
    glClearColor(0.0,0.0,1.0,1.0);
    glMatrixMode(GL_PROJECTION);
    gluOrtho2D(0.0,200.0,0.0,150.0);
}
void displayFcn(void)
{
    glClear(GL_COLOR_BUFFER_BIT);
}
void winReshapeFcn(GLint newWidth,GLint newHeight)
{
    glViewport(0,0,newWidth,newHeight);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0.0,GLdouble(newWidth),0.0,GLdouble(newHeight));
    winWidth=newWidth;
    winHeight=newHeight;
}
void drawLineSegment(scrPt endPt1,scrPt endPt2)
{
    glBegin(GL_LINES);
    glVertex2i(endPt1.x,endPt1.y);
    glVertex2i(endPt2.x,endPt2.y);
    glEnd();
}
void polyLine(GLint button,GLint action,GLint xMouse,GLint yMouse)
{
    static scrPt endPt1,endPt2;
    if(endPtCtr==0)
    {
        if(button==GLUT_LEFT_BUTTON&&action==GLUT_DOWN)
        {
            endPt1.x=xMouse;
            endPt1.y=winHeight-yMouse;
            endPtCtr=1;
        }
        else
            if(button==GLUT_RIGHT_BUTTON)
                exit(0);
    }
    else
        if(button==GLUT_LEFT_BUTTON&&action==GLUT_DOWN)
        {
            endPt2.x=xMouse;
            endPt2.y=winHeight-yMouse;
            drawLineSegment(endPt1,endPt2);
            endPt1=endPt2;
        }
        else
            if(button==GLUT_RIGHT_BUTTON)
                exit(0);
    glFlush();
}
int main(int argc,char** argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
    glutInitWindowPosition(100,100);
    glutInitWindowSize(winWidth,winHeight);
    glutCreateWindow("Draw Interactive Polylines");
    init();
    glutDisplayFunc(displayFcn);
    glutReshapeFunc(winReshapeFcn);
    glutMouseFunc(polyLine);
    glutMainLoop();
}

1 个答案:

答案 0 :(得分:4)

您最好的选择可能是使用OpenGL Utility Library('GLU')提供的曲面细分器。您可以通过gluTessProperty将缠绕规则指定为奇数,非零,负,正或大于或等于2中的任何一个。曲面细分具有将任意多边形(例如用户描述的多边形)转换为OpenGL可以渲染的一组凸多边形的效果。

GLU在Windows上以a system library提供,通常可在Linux衍生的操作系统上使用,如果不能完成所有这些操作,您可以相对轻松地将MESA实施直接包含在项目中。例如,我已经在iPad应用程序中部署了它。

补充:如果您使用的是Dev C,那么您应该已经拥有了libglu32.a库。链接到那个,大概是通过-lglu32。然后,您应该能够使用here给出的代码和指导(特别注意关于绕组规则的结束语)或here