Реализовать правило намотки в OpenGL - PullRequest
2 голосов
/ 24 ноября 2011

У меня есть этот код, в котором пользователь рисует некоторый многоугольник, используя указатель мыши в 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 Ответ

4 голосов
/ 24 ноября 2011

Лучше всего, вероятно, использовать tessellator, предоставляемый утилитарной библиотекой OpenGL ('GLU'). Вы можете указать правило намотки через gluTessProperty как любое из нечетного, ненулевого, отрицательного, положительного или большего или равного двум. Тесселяция имеет эффект превращения произвольного многоугольника, такого как описанный вашим пользователем, в набор выпуклых многоугольников, которые может отображать OpenGL.

GLU предоставляется как системная библиотека в Windows, обычно доступна в операционных системах на основе Linux, и в случае неудачи вы можете относительно легко включить реализацию MESA непосредственно в ваш проект. Например, я развернул его в приложениях для iPad.

Дополнения: если вы используете Dev C, то у вас уже должна быть библиотека libglu32.a. Ссылка на это, предположительно, через -lglu32. После этого вы сможете использовать код и указания, приведенные здесь (особенно обратите внимание на заключительные замечания по правилам обмотки) или здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...