计算机专业图形学openGL五角星代码
使用opengl程序实现星球环绕

GIS专业实验报告(计算机图形学)实验8 使用opengl程序实现三维星球环绕效果一.实验目的及要求使用opengl程序实现三维星球环绕效果。
二.理论基础三维图形变换:三维图形变换包括三维几何变换和投影变换,通过它可由简单图形得到复杂图形,可以用二维图形表示三维对象。
三.算法设计与分析程序源码如下:#include <gl/gl.h>#include <gl/glu.h>#include <gl/glut.h>static GLfloat angle = 0.0, moon_angle = 0.0;void display(){glClearColor( 1.0, 1.0, 0.0, 0.0 );glShadeModel( GL_SMOOTH );glMatrixMode( GL_PROJECTION );glLoadIdentity();gluPerspective( 80.0, 1.0, 1.0, 50.0 );glMatrixMode( GL_MODELVIEW );glLoadIdentity();gluLookAt(8.0, 5.0, 8.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );//定义太阳的光照//发出白色的光{GLfloat light_ambient[] = { 0.0, 0.0, 0.0, 1.0 };GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };GLfloat light_position[] = { 0.0, 0.0, 0.5, 1.0 };//最后一个参数为正数,表明是位置性光源glEnable( GL_LIGHT0 );glEnable( GL_LIGHTING );glEnable( GL_DEPTH_TEST );//定义太阳的材质//显红色GLfloat mat_ambient[] = { 0.3, 0.0, 0.0, 1.0 };GLfloat mat_emission[] = { 0.3, 0.0, 0.0, 1.0 };//绘制太阳glLightfv( GL_LIGHT0, GL_AMBIENT, light_ambient );glLightfv( GL_LIGHT0, GL_DIFFUSE, light_diffuse );glLightfv( GL_LIGHT0, GL_SPECULAR, light_specular );glLightfv( GL_LIGHT0 ,GL_POSITION, light_position );glMaterialfv( GL_FRONT ,GL_AMBIENT_AND_DIFFUSE, mat_ambient );glMaterialfv( GL_FRONT, GL_EMISSION, mat_emission );GLfloat ambient[] = { 0.2, 0.2, 0.2, 1.0 };glLightModelfv( GL_AMBIENT, ambient );glutSolidSphere( 2.0, 40, 40 );}//定制地球不发光,有材质{GLfloat mat_ambient[] = { 0.0, 0.0, 0.5, 1.0 };GLfloat mat_specular[] = { 0.0, 0.0, 1.0, 1.0 };GLfloat mat_shiness[] = { 30.0 };GLfloat mat_emission[] = { 0.0, 0.0, 0.1, 1.0 };glMaterialfv( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, mat_ambient );glMaterialfv( GL_FRONT, GL_SPECULAR, mat_specular );glMaterialfv( GL_FRONT, GL_EMISSION, mat_emission );glMaterialfv( GL_FRONT, GL_SHININESS, mat_shiness );glRotatef( angle, 0.0, 1.0, 0.0 );glTranslatef( 6.0, 0.0, 0.0 );glutSolidSphere( 0.5, 40, 40 );}//定制月球{GLfloat mat_ambient[] = { 0.2, 0.2, 0.2, 1.0 };GLfloat mat_specular[] = { 0.8, 0.8, 0.80, 1.0 };GLfloat mat_shiness[] = { 30.0 };GLfloat mat_emission[] = { 0.3, 0.3, 0.3, 1.0 };glMaterialfv( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, mat_ambient );glMaterialfv( GL_FRONT, GL_SPECULAR, mat_specular );glMaterialfv( GL_FRONT, GL_EMISSION, mat_emission );glMaterialfv( GL_FRONT, GL_SHININESS, mat_shiness );glRotatef( moon_angle, 0.0, angle, 1.0 );glTranslatef( 1.0, 0.0, 0.0 );glutSolidSphere( 0.3, 30, 30 );}glutSwapBuffers();}void idle(){angle += 0.5;moon_angle += 2.0;if ( angle > 360.0 ){angle = 0.0f;}if ( moon_angle > 360.0 ){moon_angle = 0.0;}glutPostRedisplay();}void menu( int id ){if ( id == 1 ){exit( 0 );}}int main( int argc, char ** argv ){glutInit( &argc, argv );glutInitDisplayMode( GLUT_RGBA | GLUT_DOUBLE ); glutInitWindowPosition( 100, 100 );glutInitWindowSize(800, 450 );glutCreateWindow("模拟星球");glutDisplayFunc( display );glutIdleFunc( idle );glutCreateMenu( menu );glutAddMenuEntry( "Out", 1 );glutAttachMenu( GLUT_RIGHT_BUTTON );glutMainLoop();}四.程序调试及运行结果的自我分析与自我评价运行结果见下图1。
计算机图形学用OpenGL画出矩形三角形和点

计算机图形学⽤OpenGL画出矩形三⾓形和点计算机图形学实验报告实验1 OpenGL初识1.实验⽬的熟悉编程环境;了解光栅图形显⽰器的特点;了解计算机绘制图形的特点;利⽤VC+OpenGL 作为开发平台设计程序,以能够在屏幕上⽣成任意⼀个像素点作为本实验的⽬标2.实验内容(1) 了解和使⽤vc的开发环境,理解简单的OpenGL程序结构(2) 掌握OpenGL提供的基本图形函数,尤其是⽣成点的函数3.实验原理(1)基本语法OpenGL基本函数均使⽤gl作为函数名的前缀;为了便于移植,OpenGL定义了⼀些⾃⼰的数据类型(2)程序的基本结构OpenGL程序的基本结构可以分为三个部分,第⼀部分是初始化部分,主要是设置⼀些OpenGL的状态开关,如颜⾊模式的选择,是否作光照处理,深度检测,裁剪等;第⼆部分设置观察坐标系下的取景模式和取景框位置⼤⼩;第三部分是OpenGL的主要部分,使⽤OpenGL的库函数构造⼏何物体对象的数学描述,包括点线⾯的位置和拓扑关系、⼏何变换和光照处理等。
(3)状态机制OpenGL的⼯作⽅式是⼀种状态机制,它可以进⾏各种状态或模式设置,这些状态或模式在重新改变它们之前⼀直有效。
例如,当前颜⾊就是⼀个状态变量,在这个状态改变之前, 绘制的每个像素都将使⽤该颜⾊, 直到当前颜⾊被设置为其他颜⾊为⽌。
OpenGL 中⼤量使⽤了这种状态机制,如颜⾊模式、投影模式、单双显不1缓存区的设置、背景⾊的设置、光源的位置和特性等。
许多状态变量可以通过glEnable0、glDisable0这两个函数来设置成有效或⽆效状态, 如是否设置光照、是否进⾏深度检测等; 在被设置成有效状态之后,绝⼤部分状态变量都有⼀个默认值。
通常情况下,可以⽤下列四个函数来获取某个状态变量的值: glGetBooleanv、glGetDouble.、. glGetF1oatv 和glGetIntegerv。
究竟选择哪个函数应该根据所要获得的返回值的数据类型来决定。
计算机图形学实验报告-OpenGL基本使用

学生实验实习报告册学年学期:2016-2017学年 春□√秋学期课程名称:大学计算机基础学生学院:通信与信息工程学院专业班级:学生学号:学生姓名:联系电话:重庆邮电大学教务处印制实验实习名OpenGL基本使用指导教师秦红星考核成绩课程名称计算机图形学A 课程编号实验实习地点信息科技大厦S306 完成日期学生姓名学生学号学院专业广电与数字媒体类所在班级教师评语教师签名:年月日一、实验实习目的及要求目的:认识了解OpenGL的性质、功能要求:1.利用OpenGL绘制一个简单的场景:比如球体、正方体2.加入灯光3.实现交互操作:平移、缩放、旋转二、实验实习设备(环境)及要求(软硬件条件)采用Microsoft Visual C 2010生成环境并用C++编写程序三、实验实习内容与步骤内容:背景为黑色,在点光源下,能够实现平移、缩放、旋转的球。
步骤:建立立体-->添加光照-->添加变换1.先写“主函数”,在主函数中将窗口生成好。
2.在“自定义函数1”中对窗口进行清除、填色等操作。
3.在“自定义函数1”中设置点光源,设置光照的各种参数。
4.在“自定义函数1”中设置平移、缩放、旋转及各参数。
5.在“自定义函数2”中设置平移和缩放的循环。
6.在主函数中调用这两个自定义函数,并且在主函数里面用“自定义函数1”为参数调用glutDisplayFunc()来注册一个绘图函数。
其次用空闲回调函数glutIdleFunc()来使球体不停地循环有缩放、平移功能的函数。
实现动画。
四、实验实习过程或算法(源程序、代码)#include<GL/glut.h>GLfloat angle = 0.0f;GLfloat multiply = 0.0f;void display(void){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glClearColor(0.0f, 0.0f, 0.0f, 0.0f); //设置窗口里面的背景颜色glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(90.0f, 1.0f, 1.0f, 20.0f);glLoadIdentity();gluLookAt(0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);{//设置一个点光源GLfloat light_position[] = { 0.5f,0.0f,0.0f,1.0f };//(xyzw)w为1时代表点光源,0时代表方向光源GLfloat light_ambient[] = { 0.5f,0.5f,0.5f,1.0f };//(0001)GLfloat light_diffuse[] = { 1.0f,1.0f,1.0f,1.0f };//(1111)GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };//(1111)glLightfv(GL_LIGHT0, GL_POSITION, light_position);glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);//光源环境光强值glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);//光源漫反射强值glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);//光源镜面反射强值glEnable(GL_LIGHT0);//打开该光源glEnable(GL_LIGHTING);//打开光照}{glRotatef(angle, 0.0f, 1.0f, 0.0f);glTranslatef(0.0f, 0.0f, 0.6f); //平移glScaled(multiply, multiply, multiply); //缩放glutSolidSphere(0.2, 50, 50);}glutSwapBuffers();}void rotateAndzoom(void) //旋转和缩放{angle += 1.0f;if (angle >= 360.0f)angle = 0.0f;display();//设置旋转multiply += 0.01f;if (multiply >= 2.0f)// multiply -= 0.01f;//if (multiply <= 1.0f)multiply = 1.0f;display();//设置缩放}int main(int argc, char* argv[]){glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);glutInitWindowPosition(400, 50);glutInitWindowSize(800, 800);glutCreateWindow("立体");glutDisplayFunc(&display);glutIdleFunc(&rotateAndzoom);//旋转glutMainLoop();//调用该函数启动程序,所有以创建的窗口将会显示return 0;}五、实验实习结果分析和(或)源程序调试过程实验实习名直线扫面和区域填充实现指导教师考核成绩课程名称课程编号实验实习地点完成日期学生姓名学生学号学院专业通信与信息工程学院广电与数字媒体类所在班级教师评语教师签名:年月日一、实验实习目的及要求项目目的:熟悉光栅图形学中的相关算法项目要求:1.应用OpenGL点绘制函数直线与区域2.采用直线扫面算法绘制一条线段,直线有离散点组成3.利用区域填充算法绘制多边形区域,区域由离散点组成二、实验实习设备(环境)及要求(软硬件条件)采用Microsoft Visual C 2010生成环境并用C++编写程序三、实验实习内容与步骤内容:1.用DDA算法实现点绘制直线。
计算机图形学五角星的裁剪代码

float fy(int y){return (centerY - y) * pixelSize;}
void drawLine(Graphics g, float xP, float yP, float xQ, float yQ)
{
public void mousePressed(MouseEvent evt)
{
float x = fx(evt.getX()), y = fy(evt.getY());
if(np == 2) np = 0;
if(np == 0) {xmin = x; ymin = y;}
drawLine(g, xmin, ymin, xmax, ymin);
drawLine(g, xmax, ymin, xmax, ymax);
drawLine(g, xmax, ymax, xmin, ymax);
drawLine(g, xmin, ymax, xmin, ymin);
if ((cP & 1) == 1){ xP += (ymax - yP) * dx / dy; yP = ymax;}
cP = clipCode(xP, yP);
}
else
if(cQ != )
{
if ((cQ & 8) == 8){ yQ += (xmin - xQ) * dy / dx; xQ = xmin;}
ClipLine()
{
super("Click on two opposite corners of a rectangle");
opengl教程c语言版

OpenGL教程(c语言)1.第一课:说起编程作图,大概还有很多人想起TC的#include <graphics.h>吧?但是各位是否想过,那些画面绚丽的PC游戏是如何编写出来的?就靠TC那可怜的640*480分辨率、16色来做吗?显然是不行的。
本帖的目的是让大家放弃TC的老旧图形接口,让大家接触一些新事物。
OpenGL作为当前主流的图形API之一,它在一些场合具有比DirectX更优越的特性。
1、与C语言紧密结合。
OpenGL命令最初就是用C语言函数来进行描述的,对于学习过C语言的人来讲,OpenGL是容易理解和学习的。
如果你曾经接触过TC的graphics.h,你会发现,使用OpenGL作图甚至比TC更加简单。
2、强大的可移植性。
微软的Direct3D虽然也是十分优秀的图形API,但它只用于Windows系统(现在还要加上一个XBOX游戏机)。
而OpenGL不仅用于Windows,还可以用于Unix/Linux等其它系统,它甚至在大型计算机、各种专业计算机(如:医疗用显示设备)上都有应用。
并且,OpenGL的基本命令都做到了硬件无关,甚至是平台无关。
3、高性能的图形渲染。
OpenGL是一个工业标准,它的技术紧跟时代,现今各个显卡厂家无一不对OpenGL提供强力支持,激烈的竞争中使得OpenGL性能一直领先。
总之,OpenGL是一个很NB的图形软件接口。
至于究竟有多NB,去看看DOOM3和QUAKE4等专业游戏就知道了。
OpenGL官方网站(英文)下面我将对Windows下的OpenGL编程进行简单介绍。
学习OpenGL前的准备工作第一步,选择一个编译环境现在Windows系统的主流编译环境有Visual Studio,Broland C++ Builder,Dev-C++等,它们都是支持OpenGL 的。
但这里我们选择Visual Studio 2005作为学习OpenGL的环境。
计算机图形学课程设计完本

1中文摘要本次课程设计采用OpenGL来完成。
OpenGL是个定义了一个跨编程语言、跨平台的编程接口的规格,它用于三维图象(二维的亦可)。
OpenGL是个专业的图形程序接口,是一个功能强大,调用方便的底层图形库。
本次课程设计是在win7系统下VC++6.0中的win32环境中,通过使用OpenGL所提供的标准库函数,综合图形学里的坐标转换,投影变换,光照以及纹理等知识,实现一个简单的太阳系的运行状况。
该系统仅做演示使用,将只包括太阳,地球与月亮,并且不保证相关数据的设定准确性。
目录一、课程设计任务及要求 (1)二、需求分析 (1)三、系统设计 (1)四、详细设计 (3)4.1 初始化的设定 (3)4.2 光源的位置与观察位置的设定 (4)4.3 纹理映射的设置 (5)4.4 各星球球体的绘制 (7)4.5 星球公转轨道 (9)4.6 人机交互式的实现 (10)五、运行调试与分析讨论 (12)5.1 程序运行截图 (12)5.2 结果分析 (13)六、设计体会与小结 (14)七、参考文献 (16)一、课程设计任务及要求1.利用OpenGL创建太阳,地球,月亮三个球体。
2. 实现“月亮绕着地球转,地球绕着太阳转”。
3. 为太阳,地球,月亮附上不同的纹理。
4. 具有较好的动画效果,消除闪烁现象。
5. 其他功能的添加。
二、需求分析本次课程设计使用的编译软件为Visual C++ 6.0。
设计中通过调用OpenGL函数库以来完成太阳,月亮,地球的球体绘制与纹理的加载,通过矩阵的变换以实现星球的运动效果。
从而模拟出太阳系的运行效果动画。
在之后,加入星球的轨道轨迹,使得模拟系统3D效果更加明显。
并加入人机交互操作。
通过“q,w,e,s,a,d”键来调整观察视角,可以实现全方位对此系统进行观察,使系统具有一定的可操作性。
三、系统设计本次课题为:实现太阳系运行动画。
系统设计步骤为:1.太阳,地球,月亮三个球体的创建。
OpenGL入门学习之二——绘制几何图形

glVertex2fv(PointA); glVertex2fv(PointC); glVertex2fv(PointE); glVertex2fv(PointB); glVertex2fv(PointD); glEnd(); glFlush(); }
例三、画出正弦函数的图形 /* 由于 OpenGL 默认坐标值只能从-1 到 1,(可以修改,但方法留到以后讲) 所以我们设置一个因子 factor,把所有的坐标值等比例缩小, 这样就可以画出更多个正弦周期
int i; glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_POLYGON); for(i=0; i<n; ++i)
glVertex2f(R*cos(2*Pi/n*i), R*sin(2*Pi/n*i)); glEnd(); glFlush(); }
例二、画一个五角星 /* 设五角星的五个顶点分布位置关系如下:
(四)glVertex4f(1.0f, 3.0f, 0.0f, 1.0f); (五)GLfloat VertexArr3[] = {1.0f, 3.0f, 0.0f};
C语言课程设计 在屏幕上绘制一个动态五角星 完整版

目录一.设计题目 (2)二.题目内容的描述 (2)三.应用程序功能的详细说明 (2)四.输入数据类型格式和内容限制 (8)五.N-S流程图 (9)六.结束语 (11)七.程序的源代码清单 (11)沈阳理工大学计算机程序训练任务书姓名:班级:学号:一.设计题目:在屏幕上绘制一个动态五角星具体内容(一)设计要求在屏幕上绘制一个五角星,每按一次键盘转九十度。
用循环程序计算五角星的顶点,画直线完成。
五角星显示的位置、大小和转动的方向由键盘输入,并将输入的数据送文件保存。
按回车键程序结束。
(功能延伸:改变数据文件的内容后,再根据数据文件里的数据绘制五角星)(二)技术要求1. 按照给定题目独立设计程序,上机调试通过。
2. 写出设计报告提交报告的内容如下:二.题目内容的描述在屏幕上绘制一个五角星,每按一次键盘转九十度。
用循环程序计算五角星的顶点,画直线完成。
五角星显示的位置、大小和转动的方向由键盘输入,并将输入的数据送文件保存。
按回车键程序结束。
(功能延伸:改变数据文件的内容后,再根据数据文件里的数据绘制五角星)三.应用程序功能的详细说明void set_pentagon(int *xr,int *yr,int *r)/*insert pengaton*/{FILE *fp;char filename[20],ch;printf("Input the file's name:");gets(filename);if((fp=fopen(filename,"w+"))==NULL){printf("file open error.\n");exit(0);}printf("please input the characters to the file:\n");while((ch=getchar())!='\n'){ fputc(ch,fp);putchar(ch);}fclose(fp);printf("\nplease set the xr yr and r for the pentagon you have typed in:\n");scanf("%d",xr);scanf("%d",yr);scanf("%d",r);}这一段是文件的输入与输出。