2014-02-14 51 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; 
} 
相關問題