1. 实验目的
练习OpenGL基础编程,能够利用OpenGL绘制基本图元:点,线,多边形,并可以设定一些简单的属性:颜色,线宽等。
2. 实验内容和要求
按要求完成以下三个绘图,提交纸质实验报告,同时提交实验报告和代码的电子版。
I). 利用OpenGL绘制形如下图的折线加柱状图,数据和颜色自己设定,要有文字的显示。
II). 利用OpenGL绘制形如下图的饼状图,数据和颜色自己设定,要有文字的显示。
III). 发挥想象力,自由创作一幅图画。
第一题:
源代码:
#include<GL/glut.h>
#include<stdlib.h>
#include<time.h>
GLubyte label[18]={
'J','a','n','F','e','b','M','a','r',
'A','p','r','M','a','y','J','u','n'};
GLubyte label_y[18]={
'1','0','0','2','0','0','3','0','0'};
void init(void){
glClearColor(1.0,1.0,1.0,1.0);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0.0,200.0,0.0,200.0); //坐标系
}
void lineSegment(void){
srand((unsigned)time(NULL));
glClear(GL_COLOR_BUFFER_BIT);
//绘制坐标轴
glLineWidth(2.0);
glColor3f(0.2,0.93,0.93); //绘制坐标轴的颜色
glBegin(GL_LINES); //两个点一组
glVertex2i(50 , 40); //坐标
glVertex2i(50 , 180); //坐标
glVertex2i(40 , 50); //坐标
glVertex2i(180.0 , 50); //坐标
glEnd();
//绘制箭头
glBegin(GL_TRIANGLES); //三个点一组
glVertex2i(45 , 180); //坐标
glVertex2i(50 , 185); //坐标
glVertex2i(55 , 180); //坐标
glVertex2i(180.0 , 45); //坐标
glVertex2i(185 , 50); //坐标
glVertex2i(180.0 , 55); //坐标
glEnd();
//设置柱状图
int a,arry[10],sum=0;
for(int i=60,j=0;i<180;i+=20,j++,sum++){
a=rand()%130+50; //生成最小是50的随机数
arry[j]=a;
glColor3f(0.0,0.15,0.73); //柱状图的颜色
glBegin(GL_POLYGON);
glVertex2i(i , a);
glVertex2i(i , 50);
glVertex2i(i+10 , 50);
glVertex2i(i+10 , a);
glEnd();
//给柱形图设置黑框
glColor3f(0.0,0.0,0.0);
glBegin(GL_LINE_STRIP);
glVertex2i(i+10 , 50);
glVertex2i(i+10 , a);
glVertex2i(i , a);
glVertex2i(i , 50);
glEnd();
}
//画折线图/宽度
glLineWidth(3.0);
glColor3f(1.0,0.0,0.0); //折线的颜色
glBegin(GL_LINE_STRIP);
for(i=0,j=60;i<sum;i++,j+=20){
glVertex2i(j+5 , arry[i]+10);
}
glEnd();
//设置点的大小
glColor3f(0.0,0.0,0.0); //点的颜色
glPointSize(7.0);
glBegin(GL_POINTS);
for(i=0,j=60;i<sum;i++,j+=20){
glVertex2i(j+5 , arry[i]+10);
}
glEnd();
//设置x轴上的文字
for(j=0,i=60;j<sum;j++,i+=20){
glRasterPos2i(i,45);
for(int k=3*j;k<3*j+3;k++){
glutBitmapCharacter(GLUT_BITMAP_HELVETICA_12,label[k]);
}
}
//设置纵坐标上的点
glColor3f(0.2,0.93,0.93);
glPointSize(5.0);
glBegin(GL_POINTS);
glVertex2i(50,90);
glVertex2i(50,130);
glVertex2i(50,170);
glEnd();
//设置纵坐标上的数值
glColor3f(0,0,0);
for(j=0,i=90;j<sum;j++,i+=40){
glRasterPos2i(40,i);
for(int k=3*j;k<3*j+3;k++){
glutBitmapCharacter(GLUT_BITMAP_HELVETICA_12,label_y[k]);
}
}
glFlush();
}
int main(int argc,char** argv){
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowPosition(100 , 100);
glutInitWindowSize(600 , 600);
glutCreateWindow("柱状图,折线图");
init();
glutDisplayFunc(lineSegment);
glutMainLoop();
}
运行结果:
第二题
源代码
#include<GL/glut.h>
#include<math.h>
#define PI 3.1415926
GLubyte label[18]={
'J','a','n','F','e','b','M','a','r',
'A','p','r','M','a','y','J','u','n'};
GLubyte label_y[18]={
'1','5','%','3','0','%','2','0','%',
'1','5','%','1','0','%','1','0','%'};
int Jiaodu_z[7]={
0,300,900,1300,1600,1800,2000};
void init(void){
glClearColor(1.0,1.0,1.0,1.0);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(-200.0 , 200.0 , -200.0 , 200.0);
}
void lineSegment(void){
int i,k=0,j;
float t,m;
float Jiaodu[6]; //角度存放每个扇形角度的一半(弧度)
glClear(GL_COLOR_BUFFER_BIT);
//绘制第一个扇形
glColor3f(0.2,0.93,0.93);
glBegin(GL_POLYGON);
glVertex2i(0,0);
for(i=0;i<300;i++){
t=2 * PI / 2000 * i;
glVertex2i(100 * cos(t),100 * sin(t));
}
glEnd();
m=2 * PI / 2000 * 150;
Jiaodu[k++]=m;
//绘制第二个扇形
glColor3f(0.0,0.15,0.73);
glBegin(GL_POLYGON);
glVertex2i(0,0);
for(i=300;i<900;i++){
t=2 * PI / 2000 * i;
glVertex2i(100 * cos(t),100 * sin(t));
}
glEnd();
m=2 * PI / 2000 * 600;
Jiaodu[k++]=m;
//绘制第三个扇形
glColor3f(1.0,0.0,0.0);
glBegin(GL_POLYGON);
glVertex2i(0,0);
for(i=900;i<1300;i++){
t=2 * PI / 2000 * i;
glVertex2i(100 * cos(t),100 * sin(t));
}
glEnd();
m=2 * PI / 2000 * 1100;
Jiaodu[k++]=m;
//绘制第四个扇形
glColor3f(0.0,0.4,0.2);
glBegin(GL_POLYGON);
glVertex2i(0,0);
for(i=1300;i<1600;i++){
t=2 * PI / 2000 * i;
glVertex2i(100 * cos(t),100 * sin(t));
}
glEnd();
m=2 * PI / 2000 * 1400;
Jiaodu[k++]=m;
//绘制第五个扇形
glColor3f(0.5,0.5,0.5);
glBegin(GL_POLYGON);
glVertex2i(0,0);
for(i=1600;i<1800;i++){
t=2 * PI / 2000 * i;
glVertex2i(100 * cos(t),100 * sin(t));
}
glEnd();
m=2 * PI / 2000 * 1700;
Jiaodu[k++]=m;
//绘制第六个扇形
glColor3f(0.5,0.3,0.5);
glBegin(GL_POLYGON);
glVertex2i(0,0);
for(i=1800;i<2000;i++){
t=2 * PI / 2000 * i;
glVertex2i(100 * cos(t),100 * sin(t));
}
glEnd();
m=2 * PI / 2000 * 1900;
Jiaodu[k++]=m;
//设置线宽
glColor3f(0.0,0.0,0.0);
glLineWidth(3.0);
for(k=0;k<6;k++){
glBegin(GL_LINE_LOOP);
glVertex2i(0,0);
for(i=Jiaodu_z[k];i<Jiaodu_z[k+1];i++){
t=2 * PI / 2000 * i;
glVertex2i(100 * cos(t),100 * sin(t));
}
glEnd();
}
//设置文字
for(j=0;j<6;j++){
glRasterPos2i(70*cos(Jiaodu[j]),70*sin(Jiaodu[j]));
for(int k=3*j;k<3*j+3;k++){
glutBitmapCharacter(GLUT_BITMAP_HELVETICA_12,label[k]);
}
}
//设置百分数
for(j=0;j<6;j++){
glRasterPos2i(70*cos(Jiaodu[j]),70*sin(Jiaodu[j])-10);
for(int k=3*j;k<3*j+3;k++){
glutBitmapCharacter(GLUT_BITMAP_HELVETICA_12,label_y[k]);
}
}
glFlush();
}
void main(int argc,char** argv){
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowPosition(100,100);
glutInitWindowSize(600,600);
glutCreateWindow("扇形图");
init();
glutDisplayFunc(lineSegment);
glutMainLoop();
}
运行结果
第三题
源代码
#include<GL/glut.h>
#include<math.h>
#define PI 3.1415926
void init(void){
glClearColor(1.0,1.0,1.0,1.0);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(-200.0,200.0,-200.0,200.0);
}
void lineSegment(void){
glClear(GL_COLOR_BUFFER_BIT);
int i;
float t;
//头
glColor3f(0.0,0.0,0.0);
glLineWidth(2.0);
glBegin(GL_LINE_LOOP);
for(i=0;i<=2000;i++){
t=2 * PI / 2000 * i;
glVertex2i(50 * cos(t),45+45 * sin(t));
}
glEnd();
//肚子
glColor3f(0.0,0.0,0.0);
glBegin(GL_LINE_LOOP);
for(i=0;i<=2000;i++){
t=2 * PI / 2000 * i;
glVertex2i(65 * cos(t),-50+50 * sin(t));
}
glEnd();
//左眼睛
glBegin(GL_LINE_LOOP);
for(i=0;i<=2000;i++){
t=2 * PI / 2000 * i;
glVertex2i(-20+10 * cos(t),65+10 * sin(t));
}
glEnd();
//右眼睛
glBegin(GL_LINE_LOOP);
for(i=0;i<=2000;i++){
t=2 * PI / 2000 * i;
glVertex2i(20+10 * cos(t),65+10 * sin(t));
}
glEnd();
//鼻子
//glColor3f(0.2,0.93,0.93);
glBegin(GL_LINE_LOOP);
for(i=0;i<=2000;i++){
t=2 * PI / 2000 * i;
glVertex2i(20 * cos(t),30+10 * sin(t));
}
glEnd();
//鼻孔
glBegin(GL_LINE_LOOP);
for(i=0;i<=2000;i++){
t=2 * PI / 2000 * i;
glVertex2i(-8+5 * cos(t),30+5 * sin(t));
}
glEnd();
glBegin(GL_LINE_LOOP);
for(i=0;i<=2000;i++){
t=2 * PI / 2000 * i;
glVertex2i(8+5 * cos(t),30+5 * sin(t));
}
glEnd();
//耳朵
glColor3f(0.0,0.0,0.0);
glBegin(GL_LINE_LOOP);
for(i=0;i<=2000;i++){
t=2 * PI / 2000 * i;
glVertex2i(-45+15 * cos(t),90+15 * sin(t));
}
glEnd();
glColor3f(0.0,0.0,0.0);
glBegin(GL_LINE_LOOP);
for(i=0;i<=2000;i++){
t=2 * PI / 2000 * i;
glVertex2i(45+15 * cos(t),90+15 * sin(t));
}
glEnd();
//脚
glBegin(GL_LINE_STRIP);
glVertex2i(-29,-23);
glVertex2i(-27,-27);
glVertex2i(-25,-23);
glVertex2i(-22,-27);
glVertex2i(-20,-23);
glEnd();
glBegin(GL_LINE_STRIP);
glVertex2i(29,-23);
glVertex2i(27,-27);
glVertex2i(25,-23);
glVertex2i(22,-27);
glVertex2i(20,-23);
glEnd();
glBegin(GL_LINE_STRIP);
glVertex2i(29,-65);
glVertex2i(27,-69);
glVertex2i(25,-65);
glVertex2i(22,-69);
glVertex2i(20,-65);
glEnd();
glBegin(GL_LINE_STRIP);
glVertex2i(-29,-65);
glVertex2i(-27,-69);
glVertex2i(-25,-65);
glVertex2i(-22,-69);
glVertex2i(-20,-65);
glEnd();
glPointSize(3.0);
glBegin(GL_POINTS);
glVertex2i(-10,-40);
glVertex2i(10,-40);
glVertex2i(-10,-50);
glVertex2i(10,-50);
glVertex2i(-10,-60);
glVertex2i(10,-60);
glEnd();
//尾巴
glBegin(GL_LINE_STRIP);
glVertex2i(57,-75);
glVertex2i(80,-80);
glVertex2i(70,-83);
glVertex2i(80,-71);
glVertex2i(105,-75);
glEnd();
glBegin(GL_LINES);
glVertex2i(-200,-150);
glVertex2i(200,-150);
glEnd();
//草地
glColor3f(0.486,0.988,0.0);
glBegin(GL_TRIANGLES);
for(i=-200;i<=180;i+=20){
glVertex2i(i,-150);
glVertex2i(i+10,-130);
glVertex2i(i+20,-150);
}
glEnd();
//太阳
glColor3f(1,1,0.0);
glLineWidth(2.0);
glBegin(GL_POLYGON);
for(i=0;i<=2000;i++){
t=2 * PI / 2000 * i;
glVertex2i(125+30 * cos(t),125+30 * sin(t));
}
glEnd();
glColor3f(1,1,0.0);
glLineWidth(5.0);
for(i=0;i<=2000;i+=200){
t=2 * PI / 2000 * i;
glBegin(GL_LINES);
glVertex2i(125+35 * cos(t),125+35 * sin(t));
glVertex2i(125+50 * cos(t),125+50 * sin(t));
glEnd();
}
glFlush();
}
void main(int argc,char** argv){
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowPosition(100,100);
glutInitWindowSize(600,600);
glutCreateWindow("小猪");
init();
glutDisplayFunc(lineSegment);
glutMainLoop();
}
运行结果