C 在OpenGL中实现缠绕规则

C 在OpenGL中实现缠绕规则,c,opengl,C,Opengl,我有一段代码,其中用户在OpenGL中使用鼠标指针绘制一些多边形。现在,在画完这个之后,我想让用户填充多边形,然后实现缠绕规则来判断多边形是从多边形内部填充还是从多边形外部填充。有人能告诉我怎样才能做到这一点吗 #include <cstdlib> #include <iostream> #include<GL/glut.h> GLsizei winWidth=400,winHeight=300; GLint endPtCtr=0; using namespa

我有一段代码,其中用户在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();
}
#包括
#包括
#包括
GLsizei winWidth=400,winHeight=300;
闪烁端PTCTR=0;
使用名称空间std;
类scrPt
{
公众:
闪烁x,y;
};
void init(void)
{
glClearColor(0.0,0.0,1.0,1.0);
glMatrixMode(GL_投影);
gluOrtho2D(0.0200.0,0.0150.0);
}
无效显示FCN(无效)
{
glClear(GLU颜色缓冲位);
}
void winefcn(闪烁新宽度、闪烁新高度)
{
glViewport(0,0,新宽度,新高度);
glMatrixMode(GL_投影);
glLoadIdentity();
gluOrtho2D(0.0,GLdouble(新宽度),0.0,GLdouble(新高度));
winWidth=newWidth;
winHeight=newHeight;
}
无效绘图线段(scrPt endPt1、scrPt endPt2)
{
glBegin(GL_行);
glVertex2i(endPt1.x,endPt1.y);
glVertex2i(endPt2.x,endPt2.y);
格伦德();
}
无效多段线(闪烁按钮、闪烁动作、闪烁X鼠标、闪烁Y鼠标)
{
静态scrPt endPt1、endPt2;
如果(endPtCtr==0)
{
如果(按钮==GLUT\U LEFT\U按钮和操作==GLUT\U DOWN)
{
endPt1.x=xMouse;
endPt1.y=WinyMouse;
endPtCtr=1;
}
其他的
如果(按钮==GLUT\u右按钮)
出口(0);
}
其他的
如果(按钮==GLUT\U LEFT\U按钮和操作==GLUT\U DOWN)
{
endPt2.x=xMouse;
endPt2.y=WinyMouse;
绘制线段(endPt1、endPt2);
endPt1=endPt2;
}
其他的
如果(按钮==GLUT\u右按钮)
出口(0);
glFlush();
}
int main(int argc,字符**argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
位置(100100);
GLUTINITWindowsSize(winWidth、winHeight);
创建窗口(“绘制交互式多段线”);
init();
glutDisplayFunc(displayFcn);
GLUTEFUNC(WinEFCN);
glutMouseFunc(多段线);
glutMainLoop();
}

您的最佳选择可能是使用OpenGL实用程序库(“GLU”)提供的细分器。可以通过属性将缠绕规则指定为奇数、非零、负、正或大于或等于2的任意值。细分的效果是将任意多边形(如用户描述的多边形)转化为一组OpenGL可以渲染的凸多边形

GLU是在Windows上提供的,通常在Linux派生的OSs上可用,如果所有这些都失败了,您可以相对轻松地将MESA实现直接包含到您的项目中。例如,我已经在iPad应用程序中部署了它


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

这个问题与OpenGL没有直接关系。为此,您需要实现图形算法(可能使用向量代数)。然后,另一个问题是根据您的规则对多边形进行三角剖分,以便OpenGL能够显示它。我如何在dev c+windows中使用OpenGL实现这一点???请更具体地指导我。。或者,如果可以的话,请给我一个示例代码……谢天谢地,我不再是一个Windows用户,所以我不能说得特别具体,但我添加了几个链接,可以让您了解GLU的工作原理,Google报告说,Dev C天生就有正确的库来链接到相关的DLL。