OpenGL实验 绘制三种五角星

OpenGL实验 绘制三种五角星

由于自己在做的时候网上找不到类似的,所以想贴出来,希望可以给大家提供个想法。

先上 结果图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
三个图分别属于(1)线框显示(2)均匀着色(3)两种颜色,

  1. 线框显示
    使用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();//交换缓冲(双缓冲时使用)
}
  1. 两种颜色 :先讲两种颜色,因为五角星不是凸多边形,而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();//交换缓冲(双缓冲时使用)
}
  1. 均匀着色
    就很简单了,把10个三角形一个颜色就好**。

思路比较简单,大家凑合看,有什么想法可以留言,Nice!

猜你喜欢

转载自blog.csdn.net/weixin_42650480/article/details/104972454
今日推荐