多边形
- 三角形图元
三角形按照逆时针的顺序,3个3个给出点坐标即可。
- 三角剖分的多边形图元
- GL_TRIANGLE_STRIP
一种连续使用之前两个顶点的三角剖分,具体可以看注释(听说效率比较高)
- GL_TRIANGLE_FAN
扇形的三角剖分
- GL_TRIANGLE_STRIP
- 凸多边形图元
按照逆时针次序给出
- 四边形图元
逆时针次序4个4个给出
- 共用边的四边形图元
每次四边形用之前的两个点,具体顺序参照注释
#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();
}