创建一个正五边形

时间:2015-01-15 21:06:43

标签: opengl glut

我使用OpenGLglut使用glBegin(GL_TRIANGLE_FAN);函数创建正五边形。但问题是,我的形状不规则,因为它会从中心创建每个三角形。

// Draw traingle fan
glBegin(GL_TRIANGLE_FAN);
//Send the vertices and colors for the pentagon
glColor4f(0.0f, 1.0f, 0.0f, 1.0f);
glVertex3f(-1.0f, 2.0f, 0.0f);

glVertex3f(-3.0f, -0.5f, 0.0f);
glVertex3f(-1.5f, -3.0f, 0.0f);

glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
glVertex3f(1.0f, -2.0f, 0.0f);

glColor4f(0.1f, 0.9f, 0.3f, 1.0f);
glVertex3f(2.0f, 2.0f, 0.0f);
glEnd();

我知道五角大楼的工作原理和方式。即 -

  • 三个三角形,两个相等,一个不是
  • 内角为108°
  • 外角为72°
  • 面积约为1.7204774×s2(其中s =边长)

但我发现很难实现它。

1 个答案:

答案 0 :(得分:1)

最简单的方法是像任何其他常规n-gon一样绘制它:在圆上均匀分布n个点。

您可以在极坐标空间中生成点,每个点具有相同的半径,并为每个点增加角度(360 / n)。

大致是:

float angleIncrement = 360.0f / n;  // n is 5 in your case
angleIncrement *= M_PI / 180.0f;    // convert degrees to radians
glBegin(GL_TRIANGLE_FAN);
float angle = 0.0f;
for (k = 0; k < n; ++k) {
    glVertex3f(radius * cos(angle), radius * sin(angle), 0.0f);
    angle += angleIncrement;
}
glEnd(GL_TRIANGLE_FAN);

由于这使用半径作为基本输入参数,如果给出边长,则必须做一些数学运算。如果您以图形方式查看关系,则可以得出这样的关系(其中s是边长,r半径,a角度为angleIncrement in上面的代码):

(s / 2) / r = sin(a / 2)
s / 2 = r * sin(a / 2)
r = s / (2 * sin(a / 2))