《计算机图形学》实验 2

一、实验目的:

1) 熟悉 OpenGL 的环境搭建,并可以自行搭建环境;
2) 了解并熟悉 OpenGL 程序的设计框架和基本函数;
3) 能够根据学习教程自行设计程序,绘制同心圆;
4) 能够根据学习教程自行设计程序,绘制等边三角形;

二、实验内容
共有六道题目,其中第六题是加分题。请根据给定的实验结果样例,结合参考程序设计程序,实现样例的显示效果,把程序代码和实验截图拷贝到实验报告中。

题目 1:
设计程序实现“花卷”图样,颜色可以不同。

#include <GL/glut.h>
#include <math.h> //因为用到了数学函数 cos()和 sin()
int n=3600; //圆绘制次数 注意:此处设置绘制次数为 3600,在某些电脑上能够绘制正确,但是有的电脑上无
            //法绘制正确(绘制效果如程序结尾处图所示),将绘制次数降低后,例如改为 360 次,则可以绘制正确(通过测
            //试,发现绘制次数在 2400 及以下都能够正确绘制,超过 2400 后,绘制就会出问题),原因暂未明。
float PI=3.1415926f; //定义 π
float R1=0.8f; //半径 
float R2=0.7f,R3=0.6f,R4=0.5f,R5=0.4f,R6=0.3f,R7=0.2f,R8=0.05f;
int i;
void myDisplay(void) 
{ 
 glClear(GL_COLOR_BUFFER_BIT);
 glColor4f(0,0,1,0); //定义颜色
 glBegin(GL_POLYGON);//定义绘制模式
 for (i=1;i<n;i++){
     glVertex2f(R1*cos(2*PI*i/n),R1*sin(2*PI*i/n)); //设定点坐标,共有 3600 个点,用来绘制凸多边形
 }
 glColor4f(1,1,1,0); //定义颜色
 glBegin(GL_POLYGON);//定义绘制模式
 for (i=1;i<n;i++){
     glVertex2f(R2*cos(2*PI*i/n),R2*sin(2*PI*i/n)); //设定点坐标,共有 3600 个点,用来绘制凸多边形
 }
 glColor4f(1,0,0,0); //定义颜色
 glBegin(GL_POLYGON);//定义绘制模式
 for (i=1;i<n;i++){
     glVertex2f(R3*cos(2*PI*i/n),R3*sin(2*PI*i/n)); //设定点坐标,共有 3600 个点,用来绘制凸多边形
 }
 glColor4f(1,0,1,1); //定义颜色
 glBegin(GL_POLYGON);//定义绘制模式
 for (i=1;i<n;i++){
     glVertex2f(R4*cos(2*PI*i/n),R4*sin(2*PI*i/n)); //设定点坐标,共有 3600 个点,用来绘制凸多边形
 }
 glColor4f(0,1,1,0); //定义颜色
 glBegin(GL_POLYGON);//定义绘制模式
 for (i=1;i<n;i++){
     glVertex2f(R5*cos(2*PI*i/n),R5*sin(2*PI*i/n)); //设定点坐标,共有 3600 个点,用来绘制凸多边形
 }
 glColor4f(1,1,1,1); //定义颜色
 glBegin(GL_POLYGON);//定义绘制模式
 for (i=1;i<n;i++){
     glVertex2f(R6*cos(2*PI*i/n),R6*sin(2*PI*i/n)); //设定点坐标,共有 3600 个点,用来绘制凸多边形
 }
 glColor4f(0,1,1,1); //定义颜色
 glBegin(GL_POLYGON);//定义绘制模式
 for (i=1;i<n;i++){
     glVertex2f(R7*cos(2*PI*i/n),R7*sin(2*PI*i/n)); //设定点坐标,共有 3600 个点,用来绘制凸多边形
 }
 glColor4f(1,0,0,1); //定义颜色
 glBegin(GL_POLYGON);//定义绘制模式
 for (i=1;i<n;i++){
     glVertex2f(R8*cos(2*PI*i/n),R8*sin(2*PI*i/n)); //设定点坐标,共有 3600 个点,用来绘制凸多边形
 }
 glEnd();
 glFlush();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);// 初始化 Glut
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); //明确显示模式
glutInitWindowSize(400, 400);// 以像素的方式标注窗口的大小
glutInitWindowPosition(100, 100);// 确定显示窗口的位置(左上角为起始坐标)
glutCreateWindow("画圆");//创建一个 OpenGL 的窗口
glutDisplayFunc(myDisplay);// 用于注册一个绘图函数
glutMainLoop();//用于启动程序,并使程序不断在运行,不退出,即进入消息循环
return 0;
}

运行效果:
在这里插入图片描述
题目 2:
设计程序实现“箭靶”(实心同心圆)图样,颜色可以不同。

#include <GL/glut.h>
#include <math.h> //因为用到了数学函数 cos()和 sin()
int n=3600; //圆绘制次数 注意:此处设置绘制次数为 3600,在某些电脑上能够绘制正确,但是有的电脑上无
            //法绘制正确(绘制效果如程序结尾处图所示),将绘制次数降低后,例如改为 360 次,则可以绘制正确(通过测
            //试,发现绘制次数在 2400 及以下都能够正确绘制,超过 2400 后,绘制就会出问题),原因暂未明。
float PI=3.1415926f; //定义 π
float R1=0.8f; //半径 
float R2=0.6f,R3=0.4f,R4=0.2f,R5=0.05f;
int i;
void myDisplay(void) 
{ 
 
 glClear(GL_COLOR_BUFFER_BIT);
 glColor4f(0,0,1,0); //定义颜色
 glBegin(GL_POLYGON);//定义绘制模式
 for (i=1;i<n;i++){
     glVertex2f(R1*cos(2*PI*i/n),R1*sin(2*PI*i/n)); //设定点坐标,共有 3600 个点,用来绘制凸多边形
 }
 glEnd();
 glFlush();

 glColor4f(1,1,1,0); //定义颜色
 glBegin(GL_POLYGON);//定义绘制模式
 for (i=1;i<n;i++){
     glVertex2f(R2*cos(2*PI*i/n),R2*sin(2*PI*i/n)); //设定点坐标,共有 3600 个点,用来绘制凸多边形
 }
 glEnd();
 glFlush();

 glColor4f(1,0,0,0); //定义颜色
 glBegin(GL_POLYGON);//定义绘制模式
 for (i=1;i<n;i++){
     glVertex2f(R3*cos(2*PI*i/n),R3*sin(2*PI*i/n)); //设定点坐标,共有 3600 个点,用来绘制凸多边形
 }
 glEnd();
 glFlush();

 glColor4f(1,0,1,1); //定义颜色
 glBegin(GL_POLYGON);//定义绘制模式
 for (i=1;i<n;i++){
     glVertex2f(R4*cos(2*PI*i/n),R4*sin(2*PI*i/n)); //设定点坐标,共有 3600 个点,用来绘制凸多边形
 }
 glEnd();
 glFlush();

 glColor4f(0,1,1,0); //定义颜色
 glBegin(GL_POLYGON);//定义绘制模式
 for (i=1;i<n;i++){
     glVertex2f(R5*cos(2*PI*i/n),R5*sin(2*PI*i/n)); //设定点坐标,共有 3600 个点,用来绘制凸多边形
 }
 glEnd();
 glFlush();
}

int main(int argc, char** argv)
{
glutInit(&argc, argv);// 初始化 Glut
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); //明确显示模式
glutInitWindowSize(400, 400);// 以像素的方式标注窗口的大小
glutInitWindowPosition(100, 100);// 确定显示窗口的位置(左上角为起始坐标)
glutCreateWindow("画圆");//创建一个 OpenGL 的窗口
glutDisplayFunc(myDisplay);// 用于注册一个绘图函数
glutMainLoop();//用于启动程序,并使程序不断在运行,不退出,即进入消息循环
return 0;
}

运行效果:
在这里插入图片描述
题目 3:

设计程序实现空心同心圆图样,颜色可以不同。

  • 3.1 绘制点(即表示圆的线,注意此处应该用 GL_POINTS 参数来绘制)的直径宽度为 1:
#include <GL/glut.h>
#include <math.h> //因为用到了数学函数 cos()和 sin()
int n=3600; //圆绘制次数 注意:此处设置绘制次数为 3600,在某些电脑上能够绘制正确,但是有的电脑上无
            //法绘制正确(绘制效果如程序结尾处图所示),将绘制次数降低后,例如改为 360 次,则可以绘制正确(通过测
            //试,发现绘制次数在 2400 及以下都能够正确绘制,超过 2400 后,绘制就会出问题),原因暂未明。
float PI=3.1415926f; //定义 π
float R1=0.8f; //半径 
float R2=0.6f,R3=0.4f,R4=0.2f,R5=0.05f;
int i;
void myDisplay(void) 
{ 
 
 glClear(GL_COLOR_BUFFER_BIT);
 glColor4f(0,0,1,0); //定义颜色
  //glLineWidth(width);//函数用于设置线宽
 glPointSize(1);//函数用于设置点的大小
 glBegin(GL_POINTS);//定义绘制模式

 for (i=1;i<n;i++){
     glVertex2f(R1*cos(2*PI*i/n),R1*sin(2*PI*i/n)); //设定点坐标,共有 3600 个点,用来绘制凸多边形
 }
 glEnd();
 glFlush();

 glColor4f(1,1,1,0); //定义颜色
 glBegin(GL_POINTS);//定义绘制模式
 for (i=1;i<n;i++){
     glVertex2f(R2*cos(2*PI*i/n),R2*sin(2*PI*i/n)); //设定点坐标,共有 3600 个点,用来绘制凸多边形
 }
 glEnd();
 glFlush();

 glColor4f(1,0,0,0); //定义颜色
 glBegin(GL_POINTS);//定义绘制模式
 for (i=1;i<n;i++){
     glVertex2f(R3*cos(2*PI*i/n),R3*sin(2*PI*i/n)); //设定点坐标,共有 3600 个点,用来绘制凸多边形
 }
 glEnd();
 glFlush();

 glColor4f(1,0,1,1); //定义颜色
 glBegin(GL_POINTS);//定义绘制模式
 for (i=1;i<n;i++){
     glVertex2f(R4*cos(2*PI*i/n),R4*sin(2*PI*i/n)); //设定点坐标,共有 3600 个点,用来绘制凸多边形
 }
 glEnd();
 glFlush();

 glColor4f(0,1,1,0); //定义颜色
 glBegin(GL_POINTS);//定义绘制模式
 for (i=1;i<n;i++){
     glVertex2f(R5*cos(2*PI*i/n),R5*sin(2*PI*i/n)); //设定点坐标,共有 3600 个点,用来绘制凸多边形
 }
 glEnd();
 glFlush();
}

int main(int argc, char** argv)
{
glutInit(&argc, argv);// 初始化 Glut
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); //明确显示模式
glutInitWindowSize(400, 400);// 以像素的方式标注窗口的大小
glutInitWindowPosition(100, 100);// 确定显示窗口的位置(左上角为起始坐标)
glutCreateWindow("画圆");//创建一个 OpenGL 的窗口
glutDisplayFunc(myDisplay);// 用于注册一个绘图函数

glutMainLoop();//用于启动程序,并使程序不断在运行,不退出,即进入消息循环
return 0;
}

在这里插入图片描述

  • 3.2 绘制点(即表示圆的线,注意此处应该用 GL_POINTS 参数来绘制)的直径宽度为 3:
#include <GL/glut.h>
#include <math.h> //因为用到了数学函数 cos()和 sin()
int n=3600; //圆绘制次数 注意:此处设置绘制次数为 3600,在某些电脑上能够绘制正确,但是有的电脑上无
            //法绘制正确(绘制效果如程序结尾处图所示),将绘制次数降低后,例如改为 360 次,则可以绘制正确(通过测
            //试,发现绘制次数在 2400 及以下都能够正确绘制,超过 2400 后,绘制就会出问题),原因暂未明。
float PI=3.1415926f; //定义 π
float R1=0.8f; //半径 
float R2=0.6f,R3=0.4f,R4=0.2f,R5=0.05f;
int i;
void myDisplay(void) 
{ 
 
 glClear(GL_COLOR_BUFFER_BIT);
 glColor4f(0,0,1,0); //定义颜色
  //glLineWidth(width);//函数用于设置线宽
 glPointSize(3);//函数用于设置点的大小
 glBegin(GL_POINTS);//定义绘制模式

 for (i=1;i<n;i++){
     glVertex2f(R1*cos(2*PI*i/n),R1*sin(2*PI*i/n)); //设定点坐标,共有 3600 个点,用来绘制凸多边形
 }
 glEnd();
 glFlush();

 glColor4f(1,1,1,0); //定义颜色
 glBegin(GL_POINTS);//定义绘制模式
 for (i=1;i<n;i++){
     glVertex2f(R2*cos(2*PI*i/n),R2*sin(2*PI*i/n)); //设定点坐标,共有 3600 个点,用来绘制凸多边形
 }
 glEnd();
 glFlush();

 glColor4f(1,0,0,0); //定义颜色
 glBegin(GL_POINTS);//定义绘制模式
 for (i=1;i<n;i++){
     glVertex2f(R3*cos(2*PI*i/n),R3*sin(2*PI*i/n)); //设定点坐标,共有 3600 个点,用来绘制凸多边形
 }
 glEnd();
 glFlush();

 glColor4f(1,0,1,1); //定义颜色
 glBegin(GL_POINTS);//定义绘制模式
 for (i=1;i<n;i++){
     glVertex2f(R4*cos(2*PI*i/n),R4*sin(2*PI*i/n)); //设定点坐标,共有 3600 个点,用来绘制凸多边形
 }
 glEnd();
 glFlush();

 glColor4f(0,1,1,0); //定义颜色
 glBegin(GL_POINTS);//定义绘制模式
 for (i=1;i<n;i++){
     glVertex2f(R5*cos(2*PI*i/n),R5*sin(2*PI*i/n)); //设定点坐标,共有 3600 个点,用来绘制凸多边形
 }
 glEnd();
 glFlush();
}

int main(int argc, char** argv)
{
glutInit(&argc, argv);// 初始化 Glut
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); //明确显示模式
glutInitWindowSize(400, 400);// 以像素的方式标注窗口的大小
glutInitWindowPosition(100, 100);// 确定显示窗口的位置(左上角为起始坐标)
glutCreateWindow("画圆");//创建一个 OpenGL 的窗口
glutDisplayFunc(myDisplay);// 用于注册一个绘图函数

glutMainLoop();//用于启动程序,并使程序不断在运行,不退出,即进入消息循环
return 0;
}

运行效果:
在这里插入图片描述

  • 3.3 绘制点(即表示圆的线,注意此处应该用 GL_POINTS 参数来绘制)的直径宽度为 5:
#include <GL/glut.h>
#include <math.h> //因为用到了数学函数 cos()和 sin()
int n=3600; //圆绘制次数 注意:此处设置绘制次数为 3600,在某些电脑上能够绘制正确,但是有的电脑上无
            //法绘制正确(绘制效果如程序结尾处图所示),将绘制次数降低后,例如改为 360 次,则可以绘制正确(通过测
            //试,发现绘制次数在 2400 及以下都能够正确绘制,超过 2400 后,绘制就会出问题),原因暂未明。
float PI=3.1415926f; //定义 π
float R1=0.8f; //半径 
float R2=0.6f,R3=0.4f,R4=0.2f,R5=0.05f;

int i;
void myDisplay(void) 
{ 
 
 glClear(GL_COLOR_BUFFER_BIT);
 glColor4f(0,0,1,0); //定义颜色
  //glLineWidth(width);//函数用于设置线宽
 glPointSize(5);//函数用于设置点的大小
 glBegin(GL_POINTS);//定义绘制模式

 for (i=1;i<n;i++){
     glVertex2f(R1*cos(2*PI*i/n),R1*sin(2*PI*i/n)); //设定点坐标,共有 3600 个点,用来绘制凸多边形
 }
 glEnd();
 glFlush();

 glColor4f(1,1,1,0); //定义颜色
 glBegin(GL_POINTS);//定义绘制模式
 for (i=1;i<n;i++){
     glVertex2f(R2*cos(2*PI*i/n),R2*sin(2*PI*i/n)); //设定点坐标,共有 3600 个点,用来绘制凸多边形
 }
 glEnd();
 glFlush();

 glColor4f(1,0,0,0); //定义颜色
 glBegin(GL_POINTS);//定义绘制模式
 for (i=1;i<n;i++){
     glVertex2f(R3*cos(2*PI*i/n),R3*sin(2*PI*i/n)); //设定点坐标,共有 3600 个点,用来绘制凸多边形
 }
 glEnd();
 glFlush();

 glColor4f(1,0,1,1); //定义颜色
 glBegin(GL_POINTS);//定义绘制模式
 for (i=1;i<n;i++){
     glVertex2f(R4*cos(2*PI*i/n),R4*sin(2*PI*i/n)); //设定点坐标,共有 3600 个点,用来绘制凸多边形
 }
 glEnd();
 glFlush();

 glColor4f(0,1,1,0); //定义颜色
 glBegin(GL_POINTS);//定义绘制模式
 for (i=1;i<n;i++){
     glVertex2f(R5*cos(2*PI*i/n),R5*sin(2*PI*i/n)); //设定点坐标,共有 3600 个点,用来绘制凸多边形
 }
 glEnd();
 glFlush();
}

int main(int argc, char** argv)
{
glutInit(&argc, argv);// 初始化 Glut
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); //明确显示模式
glutInitWindowSize(400, 400);// 以像素的方式标注窗口的大小
glutInitWindowPosition(100, 100);// 确定显示窗口的位置(左上角为起始坐标)
glutCreateWindow("画圆");//创建一个 OpenGL 的窗口
glutDisplayFunc(myDisplay);// 用于注册一个绘图函数

glutMainLoop();//用于启动程序,并使程序不断在运行,不退出,即进入消息循环
return 0;
}

运行效果:
在这里插入图片描述
题目 4:

绘制同心实心等边三角形,颜色可以不同

#include <GL/glut.h>
void myDisplay(void) 
{ 
 glClear(GL_COLOR_BUFFER_BIT);
 glColor4f(0,0,1,0); //定义颜色
 glBegin(GL_TRIANGLE_FAN); //定义绘制模式
 glVertex2f(0.0, 0.8); //定义三角形三个顶点坐标
 glVertex2f(-1.0, -0.6);
 glVertex2f(1.0, -0.6);
 glEnd();
 glFlush();

 glColor4f(0,1,1,1); //定义颜色
 glBegin(GL_TRIANGLE_FAN); //定义绘制模式
 glVertex2f(0.0, 0.6); //定义三角形三个顶点坐标
 glVertex2f(-0.8, -0.5);
 glVertex2f(0.8, -0.5);
 glEnd();
 glFlush();

 glColor4f(1,1,1,1); //定义颜色
 glBegin(GL_TRIANGLE_FAN); //定义绘制模式
 glVertex2f(0.0, 0.4); //定义三角形三个顶点坐标
 glVertex2f(-0.6, -0.4);
 glVertex2f(0.6, -0.4);
 glEnd();
 glFlush();

 glColor4f(1,0,1,1); //定义颜色
 glBegin(GL_TRIANGLE_FAN); //定义绘制模式
 glVertex2f(0.0, 0.2); //定义三角形三个顶点坐标
 glVertex2f(-0.4, -0.3);
 glVertex2f(0.4, -0.3);
 glEnd();
 glFlush();

 glColor4f(1,0,0,1); //定义颜色
 glBegin(GL_TRIANGLE_FAN); //定义绘制模式
 glVertex2f(0.0, 0.05); //定义三角形三个顶点坐标
 glVertex2f(-0.2, -0.2);
 glVertex2f(0.2, -0.2);
 glEnd();
 glFlush();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);// 初始化 Glut
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); //明确显示模式
glutInitWindowSize(400, 400);// 以像素的方式标注窗口的大小
glutInitWindowPosition(100, 100);// 确定显示窗口的位置(左上角为起始坐标)
glutCreateWindow("画三角形");//创建一个 OpenGL 的窗口
glutDisplayFunc(myDisplay);// 用于注册一个绘图函数
glutMainLoop();//用于启动程序,并使程序不断在运行,不退出,即进入消息循环
return 0; 
 }

运行效果:
在这里插入图片描述
题目 5:

绘制同心空心等边三角形,颜色可以不同。

  • 5.1 绘制三角形边(注意此处应该用 GL_LINE_LOOP 参数来绘制)的线宽为 1:
#include <GL/glut.h>
void myDisplay(void) 
{ 
 glClear(GL_COLOR_BUFFER_BIT);
 glColor4f(0,0,1,0); //定义颜色
 glLineWidth(1);
 glBegin(GL_LINE_LOOP); //定义绘制模式
 glVertex2f(0.0, 0.8); //定义三角形三个顶点坐标
 glVertex2f(-1.0, -0.6);
 glVertex2f(1.0, -0.6);
 glEnd();
 glFlush();

 glColor4f(0,1,1,1); //定义颜色
 glBegin(GL_LINE_LOOP); //定义绘制模式
 glVertex2f(0.0, 0.6); //定义三角形三个顶点坐标
 glVertex2f(-0.8, -0.5);
 glVertex2f(0.8, -0.5);
 glEnd();
 glFlush();

 glColor4f(1,1,1,1); //定义颜色
 glBegin(GL_LINE_LOOP); //定义绘制模式
 glVertex2f(0.0, 0.4); //定义三角形三个顶点坐标
 glVertex2f(-0.6, -0.4);
 glVertex2f(0.6, -0.4);
 glEnd();
 glFlush();

 glColor4f(1,0,1,1); //定义颜色
 glBegin(GL_LINE_LOOP); //定义绘制模式
 glVertex2f(0.0, 0.2); //定义三角形三个顶点坐标
 glVertex2f(-0.4, -0.3);
 glVertex2f(0.4, -0.3);
 glEnd();
 glFlush();

 glColor4f(1,0,0,1); //定义颜色
 glBegin(GL_LINE_LOOP); //定义绘制模式
 glVertex2f(0.0, 0.05); //定义三角形三个顶点坐标
 glVertex2f(-0.2, -0.2);
 glVertex2f(0.2, -0.2);
 glEnd();
 glFlush();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);// 初始化 Glut
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); //明确显示模式
glutInitWindowSize(400, 400);// 以像素的方式标注窗口的大小
glutInitWindowPosition(100, 100);// 确定显示窗口的位置(左上角为起始坐标)
glutCreateWindow("画三角形");//创建一个 OpenGL 的窗口
glutDisplayFunc(myDisplay);// 用于注册一个绘图函数
glutMainLoop();//用于启动程序,并使程序不断在运行,不退出,即进入消息循环
return 0;
}

运行效果:
在这里插入图片描述

  • 5.2 绘制三角形边(注意此处应该用 GL_LINE_LOOP 参数来绘制)的线宽为 3:
  • 5.3 绘制三角形边(注意此处应该用 GL_LINE_LOOP 参数来绘制)的线宽为 5
  • (同上画圆,修改参数即可)

题目 6:加分题

绘制一个奥运五环图(近似)

#include <GL/glut.h>
#include <math.h> //因为用到了数学函数 cos()和 sin()
int n=3600; //圆绘制次数 注意:此处设置绘制次数为 3600,在某些电脑上能够绘制正确,但是有的电脑上无
//法绘制正确(绘制效果如程序结尾处图所示),将绘制次数降低后,例如改为 360 次,则可以绘制正确(通过测
//试,发现绘制次数在 2400 及以下都能够正确绘制,超过 2400 后,绘制就会出问题),原因暂未明。
float PI=3.1415926f; //定义 π
float R=0.25f; //半径 
int i;
void myDisplay(void) 
{ 
 
 glClear(GL_COLOR_BUFFER_BIT);
 glColor4f(1,0,0,0); //定义颜色
 glPointSize(8);
 glBegin(GL_POINTS);//定义绘制模式
 for (i=1;i<n;i++)
{
 glVertex2f(R*sin(2*PI*i/n)-0.6,R*cos(2*PI*i/n)+0.4); //设定点坐标,共有 3600 个点,用来绘制凸多边形
}
 glEnd();
 glFlush();

 glColor4f(0,0,1,1); //定义颜色
 glBegin(GL_POINTS);//定义绘制模式
 for (i=1;i<n;i++)
{
 glVertex2f(R*sin(2*PI*i/n)-0.06,R*cos(2*PI*i/n)+0.4); //设定点坐标,共有 3600 个点,用来绘制凸多边形
}
 glEnd();
 glFlush();

 glColor4f(0,0,0,0); //定义颜色
 glBegin(GL_POINTS);//定义绘制模式
for (i=1;i<n;i++)
{
glVertex2f(R*sin(2*PI*i/n)+0.48,R*cos(2*PI*i/n)+0.4); //设定点坐标,共有 3600 个点,用来绘制凸多边形
}
 glEnd();
 glFlush();

glColor4f(1,1,0,0); //定义颜色
 glBegin(GL_POINTS);//定义绘制模式
for (i=1;i<n;i++)
{
glVertex2f(R*sin(2*PI*i/n)-0.32,R*cos(2*PI*i/n)+0.1); //设定点坐标,共有 3600 个点,用来绘制凸多边形
}
 glEnd();
 glFlush();

glColor4f(0,1,0.5,0); //定义颜色
 glBegin(GL_POINTS);//定义绘制模式
for (i=1;i<n;i++)
{
glVertex2f(R*sin(2*PI*i/n)+0.24,R*cos(2*PI*i/n)+0.1); //设定点坐标,共有 3600 个点,用来绘制凸多边形
}
 glEnd();
 glFlush();

}

int main(int argc, char** argv)
{
glutInit(&argc, argv);// 初始化 Glut
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); //明确显示模式
glutInitWindowSize(400, 400);// 以像素的方式标注窗口的大小
glutInitWindowPosition(100, 100);// 确定显示窗口的位置(左上角为起始坐标)
glutCreateWindow("奥运五环");//创建一个 OpenGL 的窗口
glClearColor(1,1,1,1);
glutDisplayFunc(myDisplay);// 用于注册一个绘图函数
glutMainLoop();//用于启动程序,并使程序不断在运行,不退出,即进入消息循环
return 0;
}

运行效果:
在这里插入图片描述
四、主要函数说明:

1、glBegin()和 glEnd()函数限定了一组或多组图元的定点定义。
glBegin(mode)
glEnd(void)
参数说明:

  • mode:创建图元的类型。可以是以下数值: GL_POINTS:把每一个顶点作为一个点进行处理,顶点 n 即定义了点 n,共绘制 n 个点

  • GL_LINES:把每一个顶点作为一个独立的线段,顶点 2n-1 和 2n 之间共定义了 n 条线段,总共绘制 n/2 条 线段

  • GL_LINE_STRIP:绘制从第一个顶点到最后一个顶点依次相连的一组线段,第 n 和 n+1 个顶点定义了线段 n,总共绘制 n-1条线段

  • GL_LINE_LOOP:绘制从第一个顶点到最后一个顶点依次相连的一组线段,然后最后一个顶点和第一个顶 点相连,第 n 和 n+1个顶点定义了线段 n,总共绘制 n 条线段

  • GL_TRIANGLES:把每个顶点作为一个独立的三角形,顶点 3n-2、3n-1 和 3n定义了第 n 个三角形,总 共绘制 n/3 个三角形

  • GL_TRIANGLE_STRIP:绘制一组相连的三角形,对于奇数 n,顶点n、n+1 和 n+2 定义了第 n 个三角形; 对于偶数 n,顶点 n+1、n 和 n+2 定义了第 n 个三角形,总共绘制 n-2个三角形

  • GL_TRIANGLE_FAN:绘制一组相连的三角形,三角形是由第一个顶点及其后给定的顶点确定,顶点 1、n+1 和 n+2定义了第 n 个三角形,总共绘制 n-2 个三角形

  • GL_POLYGON:绘制一个凸多边形。顶点 1 到 n 定义了这个多边形。

2、glVertex2f(x,y)函数用于标注点的坐标。

  • glVertex2f(x,y)中的 x、y 坐标是以窗口中心点为坐标原点,x、y
    的值是相对于坐标原点的单位化后的值,即取值范围是[-1,1]。x、y 的后面可以带 f,也可以不带 f,f 的作用是指定数据类型为浮点型。

3、glLineWidth(GLfloat width)函数用于设置线宽
4、glPointSize(GLfloat width)函数用于设置点的大小

注意:glLineWidth()和 glPointSize()函数需要在 glBegin()函数之前调用。

It takes a strong man to save himself, and a great man to save another.

强者救赎自己,圣人普度他人。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

少年游四方

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值