用OpenGL画五角星

第一次写博客,正在上大二,学的计算机专业,因为课很杂,想把自己学过的东西顺便写下来做个记录,写的不好请见谅!


这个学期学的图形学,主要是讲OpenGL的东西,老师让我们自己用GL_LINES、GL_LINE_LOOP、GL_LINE_STRIP等方式画一些自己觉得好看的图形(由于不是教程文章,就不解释这些方法的意思和其他基本的东西了),于是理科生的我想了想也就只能想到五角星了。。。


刚开始有两种思路,一种是确定十个点,分别是五角星的五个凸点和五个凹点,然后用LOOP方法依次连接,第二种方法是只用找五个凸点,在连接的时候像我们平时手画五角星那样连接(假如从最高点为A,依次顺时针为B、C、D、E,那么就按照ACEBD的顺序连接,如下图),两种方法我都尝试过,各有优势吧。
用OpenGL画五角星_第1张图片

下面这个是方法一的效果图:
用OpenGL画五角星_第2张图片

首先说第一种方法吧,原理很简单,想象有两个同心圆,一个半径设为R=0.5f,另一个为r=0.2f,大圆上取五个等差点作为凸点,小圆上取五个点作为凹点,并且每个凸点和对应的凹点(如A与a)x与y坐标取负,也就是关于原点对称。

然后根据R和r求出五个点的坐标,如图:
用OpenGL画五角星_第3张图片
求点的坐标只需要将每个点的角度找到,带入x=R*cosα、y=R*sinα即可。

首先给出R、r和Pi的值:

const GLfloat R = 0.5f;
const GLfloat r = 0.2f;
const GLfloat Pi = 3.1415926536f;

为方便,我写了一个函数GetPoint来计算x和y的值:
GLfloat GetPointCos(GLfloat R, int angle) {
	return (R*cos(angle * Pi / 180));
}
GLfloat GetPointSin(GLfloat R, int angle) {
	return (R*sin(angle * Pi / 180));
}
确定了R和角度angle,便可以找到该点的x和y,上图的B点角度为18°,其他点分别为A 0°,C 54°,D与C关于y轴对称,E与B关于y轴对称。而小圆上的点abcde则分别与ABCDE关于原点对称,因此:

        GLfloat pointA[2] = { 0, R };
	GLfloat pointB[2] = { GetPointCos(R, 18), GetPointSin(R, 18) };
	GLfloat pointC[2] = { GetPointCos(R, 54), -GetPointSin(R, 54) };
	GLfloat pointD[2] = { -GetPointCos(R, 54), -GetPointSin(R, 54) };
	GLfloat pointE[2] = { -GetPointCos(R, 18), GetPointSin(R, 18) };
	GLfloat pointa[2] = { 0, -r };
	GLfloat pointb[2] = { -GetPointCos(r, 18), -GetPointSin(r, 18) };
	GLfloat pointc[2] = { -GetPointCos(r, 54), GetPointSin(r, 54) };
	GLfloat pointd[2] = { GetPointCos(r, 54), GetPointSin(r, 54) };
	GLfloat pointe[2] = { GetPointCos(r, 18), -GetPointSin(r, 18) };

好了,准备工作都做完了,现在就开始连线形成图形了。
如刚开始说的,我们要将这十个点按照AdBeCaDbEc的顺序依次连接(这一步如果有疑问可以画图看看),使用GL_LINE_LOOP的方法,代码如下:
        glBegin(GL_LINE_LOOP);
	glVertex2fv(pointA);
	glVertex2fv(pointd);
	glVertex2fv(pointB);
	glVertex2fv(pointe);
	glVertex2fv(pointC);
	glVertex2fv(pointa);
	glVertex2fv(pointD);
	glVertex2fv(pointb);
	glVertex2fv(pointE);
	glVertex2fv(pointc);
	glEnd();

最后别忘了调用glFlush()函数!!!

接下来的第二种方法就简单许多了,只需要把abcde五个点去掉,然后在连线阶段按照ACEBD的顺序依次连接就完成了,具体代码就不再给出了,大家可以自己试试!

好吧,第一次的博客就写到这里了,写这些的初衷只是为了记录自己学习的过程,也为了能在网上和大家共同交流共同学习,可能有些地方描述的还不够详细,或者方法不够简洁,以后会更加努力的,谢谢大家支持!

你可能感兴趣的:(OpenGL)