多边形

一些多边形的画法。

  1. 三角形图元

    三角形按照逆时针的顺序,3个3个给出点坐标即可。

  2. 三角剖分的多边形图元
    1. GL_TRIANGLE_STRIP

      一种连续使用之前两个顶点的三角剖分,具体可以看注释(听说效率比较高)

    2. GL_TRIANGLE_FAN

      扇形的三角剖分

  3. 凸多边形图元

    按照逆时针次序给出

  4. 四边形图元

    逆时针次序4个4个给出

  5. 共用边的四边形图元

    每次四边形用之前的两个点,具体顺序参照注释

#include<Windows.h>
#include<GL/glut.h>
#include<cstdio>

int p[7][2] =
{
    {0, 0},
    {100, 150},
    {150, 100},
    {200, 100},
    {250, 150},
    {200, 200},
    {150, 200},
};

void drawTriangle()
{
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3d(0.3, 0.4, 0.5);
    glBegin(GL_TRIANGLES);//按照逆时针次序给出3个3个的顶点,忽略不足3个的
    {
        glVertex2iv(p[1]);
        glVertex2iv(p[2]);
        glVertex2iv(p[6]);
        glVertex2iv(p[3]);
        glVertex2iv(p[4]);
        glVertex2iv(p[5]);
    }
    glEnd();
    glFlush();
}

void drawTriangleStrip()
{
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3d(0.5, 0.6, 0.7);
    glBegin(GL_TRIANGLE_STRIP);//用三角剖分的形式,把多个三角形组合成多边形,
    //如果n是奇数,三角形顺序为n,n+1,n+2
    //如果n是偶数,三角形顺序为n+1,n,n+2
    //可以理解为每次三角形都是按照逆时针次序,且之前两个点排在前面的方式画出。
    {
        glVertex2iv(p[1]);
        glVertex2iv(p[2]);
        glVertex2iv(p[6]);
        glVertex2iv(p[3]);
        glVertex2iv(p[5]);
        glVertex2iv(p[4]);
    }
    glEnd();
    glFlush();
}

void drawTriangleFan()
{
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3d(0.6, 0.2, 0.6);
    glBegin(GL_TRIANGLE_FAN);//每次画三角形1,n+1,n+2
    {
        glVertex2iv(p[1]);
        glVertex2iv(p[2]);
        glVertex2iv(p[3]);
        glVertex2iv(p[4]);
        glVertex2iv(p[5]);
        glVertex2iv(p[6]);
    }
    glEnd();
    glFlush();
}

void drawPolygon()
{
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3d(0.1, 0.2, 0.3);
    glBegin(GL_POLYGON);//逆时针次序
    {
        for (int i = 1; i <= 6; ++i)
        {
            glVertex2iv(p[i]);
        }
    }
    glEnd();
    glFlush();
}

void drawQuads()
{
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3d(0.3, 0.4, 0.3);
    glBegin(GL_QUADS);//每4个4个组成四边形,按照逆时针次序
    {
        for (int i = 1; i <= 6; ++i)
        {
            glVertex2iv(p[i]);
        }
    }
    glEnd();
    glFlush();
}

void drawQuadsStrip()
{
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3d(0.2, 0.5, 0.1);
    glBegin(GL_QUAD_STRIP);//之后的四边形共用之前的两个点,
    //逆时针画得四边形顺序为2n-1,2n,2n+2,2n+1
    //可以理解为每次新生成的四边形,用之前的四边形的点的顺序是逆时针的
    {
        glVertex2iv(p[1]);
        glVertex2iv(p[2]);
        glVertex2iv(p[6]);
        glVertex2iv(p[3]);
        glVertex2iv(p[5]);
        glVertex2iv(p[4]);
    }
    glEnd();
    glFlush();
}

int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(800, 600);
    glutCreateWindow("Polygon draw");
    glClearColor(1.0, 1.0, 1.0, 0.0);
    glMatrixMode(GL_PROJECTION);
    gluOrtho2D(0.0, 800.0, 0.0, 600.0);
    glutDisplayFunc(drawQuadsStrip);
    glutMainLoop();
}