使用数学计算出10个五角星的坐标,然后画出图形。
效果如下:
一直想使用Polygen画是实心的,但是Polygen对于凹的地方支持不好,会出问题,所以就使用直线画了。
数学计算可以参考一个百度提问:
如图,
A(rcos18°,rsin18°)
B(rcos90°,rsin90°)
C(rcos162°,rsin162°)
D(rcos234°,rsin234°)
E(rcos306°,rsin306°)
OF=rsin18°/sin126°=r'
F(r'cos54°,r'sin54°)
G(r'cos126°,r'sin126°)
H(r'cos198°,r'sin198°)
I(r'cos270°,r'sin272°)
J(r'cos342°,r'sin342°)
代码:
#pragma once
#include <stdio.h>
#include <GL\glew.h>
#include <GL\freeglut.h>
#include "math_3d.h"
#include <cmath>
namespace Tutorial2_pentagram
{
GLuint VBO;
const static double toPI = 3.1415926/180.0;
const static double penR = 0.8;
const static double penInR = penR * sin(18.0*toPI) / sin(126.0*toPI);
/*
外点
x=Rcos(72°*k) y=Rsin(72°*k) k=0,1,2,3,4
内点
r=Rsin18°/sin36°
x=rcos(72°*k+36°) y=rsin(72°*k+36°) k=0,1,2,3,4
逆时针
A(rcos18°,rsin18°)
B(rcos90°,rsin90°)
C(rcos162°,rsin162°)
D(rcos234°,rsin234°)
E(rcos306°,rsin306°)
OF=rsin18°/sin126°=r'
F(r'cos54°,r'sin54°)
G(r'cos126°,r'sin126°)
H(r'cos198°,r'sin198°)
I(r'cos270°,r'sin272°)
J(r'cos342°,r'sin342°)
*/
void createGeometry()
{
Vector3f vers[11];
for (int i = 0, k = 0; i < 10; i+=2, k++)
{
vers[i].x = (float)(penR * cos((18.0+72.0*k)*toPI));
vers[i].y = (float)(penR * sin((18.0+72.0*k)*toPI));
vers[i].z = 0.0f;
vers[i+1].x = (float)(penInR * cos((72.0*k+54.0)*toPI));
vers[i+1].y = (float)(penInR * sin((72.0*k+54.0)*toPI));
vers[i+1].z = 0.0f;
}
vers[10] = vers[0];
glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vers), vers, GL_STATIC_DRAW);
}
static void RenderScene()
{
glClear(GL_COLOR_BUFFER_BIT);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glDrawArrays(GL_LINE_STRIP, 0, 11);
glDisableVertexAttribArray(0);
glutSwapBuffers();
}
static void initCallBack()
{
glutDisplayFunc(RenderScene);
}
int run(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowSize(800, 600);
glutInitWindowPosition(50, 50);
glutCreateWindow("Bill's Pentagram");
initCallBack();
GLenum res = glewInit();
if (res != GLEW_OK)
{
fprintf(stderr, "Error: '%s'\n", glewGetErrorString(res));
return 1;
}
createGeometry();
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glutMainLoop();
return 0;
}
}
数学头文件:
struct Vector3f
{
float x;
float y;
float z;
Vector3f()
{
}
Vector3f(float _x, float _y, float _z)
{
x = _x;
y = _y;
z = _z;
}
};
主文件中直接调用run就可以。