vs2017
//OpenGL要包含gl.h和glut.h,但glut文件中已经包含这两个文件了
#include <gl\glut.h>
#include <gl\GL.h>
#include <iostream>
#include <cmath>
void displayFivePointStar() {
glClearColor(1, 1, 1, 1);
glClear(GL_COLOR_BUFFER_BIT);
//glBegin(GL_LINES);//十字架
//glColor3f(1.0, 0.0, 0.0);
//glVertex3f(0.00, 0.00, 0);
//glVertex3f(0.75, 0.00, 0);
//
//glEnd();
glBegin(GL_LINE_LOOP);
glColor3f(1.0, 0.0, 0.0);
glBegin(GL_LINE_LOOP);
double x, y, zx, zy, pi = 3.1416, m = pi / 2 - 2 * pi / 5, n,r1,p,r;
p = pi / 2 - pi / 5;
//n = 2 * m;
r1 = 1 * sin(m);
r = r1 / sin(p);
int i, j;
for (i = 0; i < 5; i++) {
zx = r*cos(p);
zy = r*sin(p);
x = 1 * cos(m);
y = 1 * sin(m);
glVertex2f(x, y);
glVertex2f(zx, zy);
m += 2 * pi / 5;
p += 2 * pi / 5;
}
glEnd();
glFlush();
}
void displayFivePointStar2() { // 把五角星分成十个三角形,旋转填色
glClearColor(1, 1, 1, 1);
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_TRIANGLES);
glColor3f(1.0, 0.0, 0.0);
double x, y, zx, zy, pi = 3.1416, m = pi / 2 - 2 * pi / 5, n, r1, p, r;
p = pi / 2 - pi / 5;
//n = 2 * m;
r1 = 1 * sin(m); // 默认外圈圆半径为1
r = r1 / sin(p); // r为内五个角所在圆半径
int i, j;
for (i = 0; i < 10; i++) {
zx = r * cos(p);// x,y 为外圈五个角,zx,zy为内圈五个角
zy = r * sin(p);
x = 1 * cos(m);
y = 1 * sin(m);
glVertex2f(x, y);
glVertex2f(zx, zy);
glVertex2f(0, 0);
if(i%2==0)
m += 2 * pi / 5;
else
p += 2 * pi / 5;
}
glEnd();
glFlush();
}
int main(int argc, char *argv[])
{
//对glut初始化,这个函数必须在其它glut使用之前调用一次。
//其格式比较死板,一般用glutInit(&argc, argv)就可以了。
glutInit(&argc, argv);
//设置显示方式,其中GLUT_RGB表示使用RGB颜色,与之对应的还有GLUT_INDEX(表示使用索引颜色)。
//GLUT_SINGLE表示使用单缓冲,与之对应的还有GLUT_DOUBLE(使用双缓冲)。
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(500, 100);//设置窗口在屏幕中的位置
glutInitWindowSize(400, 400);//设置窗口的大小
//根据前面设置的信息创建窗口,参数将被作为窗口的标题。
//注意:窗口被创建后,并不立即显示到屏幕上。需要调用glutMainLoop才能看到窗口。
glutCreateWindow("第一个OpenGL程序");
//设置一个函数,当需要进行画图时,这个函数就会被调用。
//这个说法不够准确,暂时这样说吧。
/*glutDisplayFunc(myDisplay);*/
/*glutDisplayFunc(display);*/
glutDisplayFunc(displayFivePointStar2);
//进行一个消息循环。
//只需要知道这个函数可以显示窗口,并且等待窗口关闭后才会返回,这就足够了。
glutMainLoop();
return 0;
}