OpenGL实验 绘制三种五角星
由于自己在做的时候网上找不到类似的,所以想贴出来,希望可以给大家提供个想法。
先上 结果图
三个图分别属于(1)线框显示(2)均匀着色(3)两种颜色,
- 线框显示 :
使用glBegin(GL_LINE_LOOP); 即可绘制首尾相连的图线出来,所以我们只要给定十个点的坐标,即可绘制出五角星。
在给定点的坐标时,可以把五角星看做一个同心圆。
所以影响五角星形状的只是大圆半径R和小圆半径r。
赋代码:顺便我说一下我的代码顶点顺序:
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_LINE_LOOP);//图形类型,GL_LINES为线段GL_TRIANGLES,GL_LINE_STRIP,GL_LINE_LOOP
float R=100,r=40;
float a,b,c,d;
a=200.0f;
b=300.0f;
c=a;
d=b-100;
glColor3f(1.0f,0.0f,0.0f);//指定顶点颜色
glVertex2f(a,b);//指定顶点坐标 【1】
glVertex2f(c-0.59*r,d+0.81*r);//sin36=0.59,cos36=0.81 【2】
glVertex2f(a-0.95*R,b-R+0.31*R);//cos18=0.95,sin18=0.31【3】
glVertex2f(c-0.95*r,d-0.31*r);//【4】
glVertex2f(a-0.59*R,b-R-0.81*R);//cos54=0.59,sin54=0.81【5】
glVertex2f(c,d-r);//【6】
glVertex2f(a+0.59*R,b-R-0.81*R);//【7】
glVertex2f(c+0.95*r,d-0.31*r);//【8】
glVertex2f(a+0.95*R,b-R+0.31*R);//【9】
glVertex2f(c+0.59*r,d+0.81*r);//【10】
glEnd();
//glFlush();//单缓冲时必须要,说明绘图命令(函数)结束
glutSwapBuffers();//交换缓冲(双缓冲时使用)
}
- 两种颜色 :先讲两种颜色,因为五角星不是凸多边形,而OpenGL绘制多边形默认是填充多边形,且要求是凸多边形,所以填充模式 下绘制凹 多边形结果错误。
所以我们应采取另一种思路: 五角星(凹10边形)分解为10个三角形来绘制
为了简单,我直接就把绘制三角形的代码给粘贴了10遍o(╥﹏╥)o,希望大家可以更快更简洁。来个图看看,简单粗暴,这就是我的绘制顺序,由于10个点都知道,所以很简单,而三角形的填充绘制也很简单,所以直接上代码。(补充一句:多出的0点就是那个中心点)
双色就是隔一个三角形改一次填充颜色,很好理解~~
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_LINE_LOOP);//图形类型,GL_LINES为线段GL_TRIANGLES,GL_LINE_STRIP,GL_LINE_LOOP
float R=100,r=40;
float a,b,c,d;
a=200.0f;
b=300.0f;
c=a;
d=b-100;
glColor3f(1.0f,0.0f,0.0f);//《1》
glBegin(GL_TRIANGLES);
glVertex2f(200,200);//【0】
glVertex2f(200,300);//指定顶点坐标 【1】
glVertex2f(c-0.59*r,d+0.81*r);//sin36=0.59,cos36=0.81 【2】
glEnd();
glColor3f(0.0f,1.0f,1.0f);//《2》
glBegin(GL_TRIANGLES);
glVertex2f(200,200);//【0】
glVertex2f(c-0.59*r,d+0.81*r);//sin36=0.59,cos36=0.81 【2】
glVertex2f(a-0.95*R,b-R+0.31*R);//cos18=0.95,sin18=0.31【3】
glEnd();
glColor3f(1.0f,0.0f,0.0f);//《3》
glBegin(GL_TRIANGLES);
glVertex2f(200,200);//【0】
glVertex2f(a-0.95*R,b-R+0.31*R);//cos18=0.95,sin18=0.31【3】
glVertex2f(c-0.95*r,d-0.31*r);//【4】
glEnd();
glColor3f(0.0f,1.0f,1.0f);//《4》
glBegin(GL_TRIANGLES);
glVertex2f(200,200);//【0】
glVertex2f(c-0.95*r,d-0.31*r);//【4】
glVertex2f(a-0.59*R,b-R-0.81*R);//cos54=0.59,sin54=0.81【5】
glEnd();
glColor3f(1.0f,0.0f,0.0f);//《5》
glBegin(GL_TRIANGLES);
glVertex2f(200,200);//【0】
glVertex2f(a-0.59*R,b-R-0.81*R);//cos54=0.59,sin54=0.81【5】
glVertex2f(c,d-r);//【6】
glEnd();
glColor3f(0.0f,1.0f,1.0f);//《6》
glBegin(GL_TRIANGLES);
glVertex2f(200,200);//【0】
glVertex2f(c,d-r);//【6】
glVertex2f(a+0.59*R,b-R-0.81*R);//【7】
glEnd();
glColor3f(1.0f,0.0f,0.0f);//《7》
glBegin(GL_TRIANGLES);
glVertex2f(200,200);//【0】
glVertex2f(a+0.59*R,b-R-0.81*R);//【7】
glVertex2f(c+0.95*r,d-0.31*r);//【8】
glEnd();
glColor3f(0.0f,1.0f,1.0f);//《8》
glBegin(GL_TRIANGLES);
glVertex2f(200,200);//【0】
glVertex2f(c+0.95*r,d-0.31*r);//【8】
glVertex2f(a+0.95*R,b-R+0.31*R);//【9】
glEnd();
glColor3f(1.0f,0.0f,0.0f);//《9》
glBegin(GL_TRIANGLES);
glVertex2f(200,200);//【0】
glVertex2f(a+0.95*R,b-R+0.31*R);//【9】
glVertex2f(c+0.59*r,d+0.81*r);//【10】
glEnd();
glColor3f(0.0f,1.0f,1.0f);//《10》
glBegin(GL_TRIANGLES);
glVertex2f(200,200);//【0】
glVertex2f(c+0.59*r,d+0.81*r);//【10】
glVertex2f(200,300);//指定顶点坐标 【1】
glEnd();
//glFlush();//单缓冲时必须要,说明绘图命令(函数)结束
glutSwapBuffers();//交换缓冲(双缓冲时使用)
}
- 均匀着色
就很简单了,把10个三角形一个颜色就好*▽*。
思路比较简单,大家凑合看,有什么想法可以留言,Nice!