2014-02-14 22 views
1

我想在屏幕上绘制一个顶点由点击决定的多边形。 左键单击可将顶点添加到多边形,右键单击将最后一个顶点添加到将其连接到第一个顶点并创建形状的多边形。从鼠标单击画一个多边形

我目前有两个向量,一个用于x坐标,另一个用于y坐标,并且我正在循环创建线循环的向量。矢量中的-1确定多边形的结束和新的开始。这是一个函数,然后在显示函数中调用。

最终,我必须扫描转换这些多边形,然后使用Sutherland Hodgman算法将它们剪切到用户定义的窗口中,但是即使让多边形显示出来也很麻烦。

glBegin(GL_LINE_LOOP); 
for (int i = 0; i < xCo.size(); i++) 
{ 
    if (xCo[i + 1] != -1) 
    { 
     glVertex2f(xCo[i], yCo[i]); 
     glVertex2f(xCo[i + 1], yCo[i + 1]); 
    } 
    else 
    { 
     glVertex2f(xCo[i + 1], yCo[i + 1]); 
     glVertex2f(xCo[0], yCo[0]); 
    } 
} 
glEnd(); 
glFlush(); 
xCo.clear(); 
yCo.clear(); 

回答

1

使用structs代替单独的阵列和float比较:

#include <glm/glm.hpp> 

typedef vector<glm::vec2> Poly; 
void drawPoly(const Poly& poly) 
{ 
    if(poly.size() == 1) 
     glBegin(GL_POINTS); 
    else 
     glBegin(GL_LINE_STRIP); 

    for(const auto& pt : poly) 
    { 
     glVertex2f(pt.x, pt.y); 
    } 

    glEnd(); 
} 

在上下文:

#include <GL/glut.h> 
#include <glm/glm.hpp> 
#include <vector> 

typedef std::vector<glm::vec2> Poly; 
void drawPoly(const Poly& poly) 
{ 
    if(poly.size() == 1) 
     glBegin(GL_POINTS); 
    else 
     glBegin(GL_LINE_STRIP); 

    for(const auto& pt : poly) 
    { 
     glVertex2f(pt.x, pt.y); 
    } 

    glEnd(); 
} 

typedef std::vector<Poly> Polys; 
Polys polys(1); 
void mouse(int button, int state, int x, int y) 
{ 
    if(GLUT_UP == state && GLUT_LEFT_BUTTON == button) 
    { 
     polys.back().push_back(glm::vec2(x, y)); 
     glutPostRedisplay(); 
    } 
    if(GLUT_UP == state && GLUT_RIGHT_BUTTON == button) 
    { 
     polys.back().push_back(polys.back().front()); 
     polys.push_back(Poly()); 
     glutPostRedisplay(); 
    } 
} 

void display() 
{ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    double w = glutGet(GLUT_WINDOW_WIDTH); 
    double h = glutGet(GLUT_WINDOW_HEIGHT); 
    glOrtho(0, w, h, 0, -1, 1); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    glColor3ub(255, 255, 255); 
    for(const auto& poly : polys) 
    { 
     drawPoly(poly); 
    } 

    glutSwapBuffers(); 
} 

int main(int argc, char **argv) 
{ 
    glutInitWindowSize(640, 480); 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE); 
    glutCreateWindow("GLUT"); 
    glutDisplayFunc(display); 
    glutMouseFunc(mouse); 
    glutMainLoop(); 
    return 0; 
} 
相关问题