计算机图形学:实验一——第一个OpenGL程序

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();
}

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

猜你喜欢

转载自blog.csdn.net/weixin_42534724/article/details/109923479