2012-10-31 67 views
0

我需要迭代绘制多边形。例如,我想绘制一个带有8个角的多边形。我需要用GL_LINES绘制第一行,然后画第二条线,它们之间长度相同,角度为135°,第三条线也有第二条线的角度135°等。 我想制作一个循环来渲染它,但我不知道如何。我有一个方法,但它不能正常工作。OpenGL使用GL_LINES绘制多边形和线条之间的夹角

第二点线n-1应该是第一点n等等...... 最后,我需要得到一个闭合的多边形。最后一行的最后一点应该是第一行的第一个点。

+1

“我有一个办法,但它不能正常工作。“......发布你的东西。 – genpfault

回答

1

使用GL_LINE_LOOP,将在您的最后一个顶点自动连接到你的第一个:

#include <GL/glut.h> 
#include <cmath> 

void glPolygon(unsigned int sides) 
{ 
    if(sides < 3) return; 

    const float PI = 3.14159; 
    const float step = (2 * PI)/static_cast<float>(sides); 

    glBegin(GL_LINE_LOOP); 
    for(unsigned int i = 0; i < sides; ++i) 
    { 
     glVertex2f(cos(i * step), sin(i * step)); 
    } 
    glEnd(); 
} 

void display() 
{ 
    glClear(GL_COLOR_BUFFER_BIT); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    double ar = glutGet(GLUT_WINDOW_WIDTH)/(double)glutGet(GLUT_WINDOW_HEIGHT); 
    glOrtho(-2 * ar, 2 * ar, -2, 2, -1, 1); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    glColor3ub(255, 0, 0); 
    glPolygon(8); 

    glutSwapBuffers(); 
} 

int main(int argc, char **argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE); 
    glutInitWindowSize(640, 480); 
    glutCreateWindow("Polygons"); 
    glutDisplayFunc(display); 
    glutMainLoop(); 
    return 0; 
} 

如果你在GL_LINES死心塌地这个工程:

void glPolygonLines(unsigned int sides) 
{ 
    if(sides < 3) return; 

    const float PI = 3.14159f; 
    const float step = (2 * PI)/static_cast<float>(sides); 

    glBegin(GL_LINES); 
    for(unsigned int i = 0; i < sides; ++i) 
    { 
     unsigned int cur = (i + 0) % sides; 
     unsigned int nxt = (i + 1) % sides; 
     glVertex2f(cos(cur * step), sin(cur * step)); 
     glVertex2f(cos(nxt * step), sin(nxt * step)); 
    } 
    glEnd(); 
} 
+0

非常感谢您的帮助,我可以通过gl_line_loop轻松绘制多边形。我的问题是绘制第一行(前两个顶点),以便我可以确定多边形的方向,例如 glVertex2f( - 。5,0.5); glVertex2f(1.0,1.0); 然后渲染一个多边形的循环 – Roya

+0

你好请帮忙............ – Roya

+0

只需要第一个'for'循环的前两个迭代。这会给你多边形的前两个点。 – genpfault