计算机图形学上机实验(09)

合集下载

计算机图形学上机实验报告

计算机图形学上机实验报告

计算机图形学实验报告姓名:学号:班级:目录实验一OpenGL程序结构练习 (3)实验二基本图形生成 (6)实验三交互式控制 (9)实验四图形基本变换 (12)实验五三维图形生成及显示 (15)实验六三维图形生成及显示 (19)实验一OpenGL程序结构练习【实验目的】1.熟悉C语言环境下OpenGL的使用方法;2.了解OpenGL程序的基本结构。

【实验原理】绝大多数OpenGL程序具有类似的结构,包含下述函数main():定义回调函数,打开一个或多个具有指定属性的窗口,进入事件循环(最后一条可执行语句)init():设置状态变量、视图、属性、回调、显示函数、输入和窗口函数#include <GL/glut.h> // glut.h includes gl.h and glu.hvoid display(){ ……}void init(){ ……}int main( intargc, char **argv){ ……}【实验内容】1.了解程序中各个结构的功能;2.用OpenGL生成三角形。

【实验步骤及结果】1.导入OpenGL的glut32.lib和glut.h文件:将.lib文件存放到C 语言程序文件夹的Library下,.h文件放到Include下;导入应用程序扩展文件glut32.dll,存放到system文件夹下。

2.打开VC 6.0,新建工程,并命名为text1,如图1.图 13.在工程text1下新建源文件,并命名为text1.cpp。

4.编写代码并编译链接,如图2所示。

图 25.运行,结果如图3所示。

图 3实验二基本图形生成【实验目的】1.熟悉OpenGL的程序结构,并了解各部分的功能。

2.学会应用OpenGL语言绘制出点,线,多边形。

【实验原理】1.GLUT函数glutInit使得应用程序可以获取命令行参数并初始化系统。

glutInitDisplayMode设置窗口的属性、RGB颜色、单缓冲区、属性按照逻辑或组合在一起。

计算机图形学实验一报告

计算机图形学实验一报告

计算机图形学实验一报告————————————————————————————————作者:————————————————————————————————日期:ﻩ计算机科学与通信工程学院实验报告课程计算机图形学实验题目二维图形绘制学生姓名学号专业班级指导教师日期成绩评定表评价内容具体内容权重得分论证分析方案论证与综合分析的正确、合理性20%算法设计算法描述的正确性与可读性20%编码实现源代码正确性与可读性30%程序书写规范标识符定义规范,程序书写风格规范20%报告质量报告清晰,提交准时10%总分指导教师签名二维图形的绘制1.实验内容(1)绘制金刚石图案金刚石图案的成图规则是:把一个圆周等分成n份,然后每两点之间连线。

当n取奇数时,该图案可一笔连续绘成,即用MoveTo函数确定一个当前点,然后连续用LineTo函数连点成线。

请设计连线规则并编程实现。

(2)绘制魔术三角形绘制下图所示的魔术三角形图案,采用三种可明显区分的颜色填充。

(3)绘制递归圆应用递归的方法绘制如下所示的图案。

2.实验环境软硬件运行环境:Windows XP开发工具:visual studio 20083. 问题分析根据实验需求,需要在MFC环境中建立一个由“文件”、“绘图”和“帮助”这3个菜单项目组成的菜单,其中“文件”的子菜单为“退出”,完成退出应用程序的工作,“绘图”,的子菜单为“Diamond”,用于绘制金刚石图案等,“帮助”的子菜单为“关于”,用于显示开发人员信息;定义一个输人对话框类,提供个两个参数的输入界面。

最后在客户区输出图案。

1.金刚石图案:为把一个半径为300的圆,等分绘制金刚石图案;设计该算法为避免直线段的重复连接,需设计一个二重循环,代表起点索引号的外层整型变量i从i=0循环到i=n-2,代表终点索引号的内层整型变量j从j=i+1循环到j=n-1。

以(p[i].x,p[i].y)为起点,以(p[j].x,p[j].y)为终点依次连接各线段形成金刚石图案。

《计算机图形学》上机实验指导1

《计算机图形学》上机实验指导1

KMUSTTeaching Records昆明理工大学《上机实验指导书》课程名称:计算机图形学所在系(部):国资院测绘系学年学期: 2012 — 2013 学年第 2 学期授课专业班级:地信101/土管101/测绘101 班级人数: 27/24/56 讲授教师:李向新教材名称:计算机图形学课程总学时: 64 ;总学分:理论学时: 38 ;实验(或实践)学时: 上机学时: 32 ;辅导(或答疑)学时: 系主任签章:第1部分计算机图形学上机实验大纲1.1 目的与任务计算机图形学上机是计算机图形学课程的组成部分之一,是掌握计算机图形学课程内容的一个重要实践环节。

通过上机实验,一方面可以让学生巩固课堂所学的计算机图形学基础理论,另一方面能让学生掌握基本的OpenGL的编程方法及技能,掌握使用OpenGL绘制基本图形,进行2D及3D维图形变换,生成曲线曲面及构建具有真实感的3D场景。

1.2 基本要求1. 了解OpenGL在计算机图形学中的应用基础知识。

2. 掌握基本的OpenGL的编程方法及技能。

3. 学会使用OpenGL绘制基本图形。

4. 学会使用OpenGL进行2D及3D维图形变换、生成曲线曲面及构建具有真实感的3D场景。

1.3 内容及学时安排上机1:glut工具包的安装及使用 2学时上机2:OpenGL编程练习 2学时上机3:OpenGL中基本几何图形的绘制 2学时上机4:二维图形变换编程练习 2学时上机5:交互式绘图技术编程练习 2学时上机6:三维图形变换编程练习 2学时上机7:OpenGL三维物体表示编程练习 2学时上机8:真实感图形的生成与处理上机 2学时合计 16学时1.4 教学参考书(1) 成思源等编著:计算机图形学,冶金工业出版社,2003.(2) (美)安杰尔(Edward Angel)著;李桂琼,张文祥译: OpenGL程序设计指南(第二版),北京:清华大学出版社,2005.(3) Edward Angel: Interactive Computer Graphics—A Top-Down Approach withOpenGL, Third Edition, Pearson Education, Inc., 2003.(4) F.S. Hill, JR:Computer Graphics Using OpenGL Second Edition, PearsonEducation, Inc., 2003.(5) James D. Foley et al.: Computer Graphics—Principles and Practice, SecondEdition in C, Pearson Education, Inc., 2002.(6) 朱家义:Visual C++程序设计,机械工业出版社,2003。

计算机图形学上机实验指导

计算机图形学上机实验指导

计算机图形学上机实验指导指导教师:张加万老师助教:张怡2009-10-10目录1.计算机图形学实验(一) – OPENGL基础 ..................................... - 1 -1.1综述 (1)1.2在VC中新建项目 (1)1.3一个O PEN GL的例子及说明 (1)2.计算机图形学实验(二) – OPENGL变换 ..................................... - 5 -2.1变换 (5)3.计算机图形学实验(三) - 画线、画圆算法的实现....................... - 9 -3.1MFC简介 (9)3.2VC6的界面 (10)3.3示例的说明 (11)4.计算机图形学实验(四)- 高级OPENGL实验...................... - 14 -4.1光照效果 (14)4.2雾化处理 (16)5.计算机图形学实验(五)- 高级OPENGL实验........................ - 20 -5.1纹理映射 (20)5.2反走样 (24)6.计算机图形学实验(六) – OPENGL IN MS-WINDOWS .......... - 27 -6.1 实验目标: (27)6.2分形 (28)1.计算机图形学实验(一) – OpenGL基础1.1综述这次试验的目的主要是使大家初步熟悉OpenGL这一图形系统的用法,编程平台是Visual C++,它对OpenGL提供了完备的支持。

OpenGL提供了一系列的辅助函数,用于简化Windows操作系统的窗口操作,使我们能把注意力集中到图形编程上,这次试验的程序就采用这些辅助函数。

本次实验不涉及面向对象编程,不涉及MFC。

1.2在VC中新建项目1.2.1新建一个项目选择菜单File中的New选项,弹出一个分页的对话框,选中页Projects中的Win32 Console Application项,然后填入你自己的Project name,如Test,回车即可。

《计算机图形学》实验指导书

《计算机图形学》实验指导书

计算机图形学实验指导书袁科计算机技术实验中心目录实验一实现DDA、中点画线算法和Bresenham画线算法 (24)实验二实现Bezier曲线 (25)实验三实现B样条曲线 (26)实验四实现多边形填充的边界标志算法 (27)实验五实现裁剪多边形的Cohen-Sutherland算法 (28)实验六二维图形的基本几何变换 (30)实验七画图软件的编制 (31)实验一实现DDA、中点画线算法和Bresenham画线算法【实验目的】1、掌握直线的多种生成算法;2、掌握二维图形显示原理。

【实验环境】VC++6.0/ BC【实验性质及学时】验证性实验,2学时,必做实验【实验内容】利用任意的一个实验环境,编制源程序,分别实现直线的三种生成算法,即数字微分法(DDA)、中点画线法以及Bresenham画线算法。

【实验原理】1、数字微分法(Digital Differential Analyzer,DDA)算法思想:基于直线的微分方程来生成直线。

ε=1/max(|△x|,|△y|)max(|△x|,|△y|)=|△x|,即|k|≤1 的情况:max(|△x|,|△y|)=|△y|,此时|k|≥1:2、中点画线法算法思想:每次在最大位移方向上走一步,另一方向是否走步取决于误差项的判断。

3、Bresenham画线算法算法思想:其基本思想同中点算法一样,即每次在最大位移方向上走一步,而另一个方向是否走步取决于误差项的判断。

【实验要求】1.上交源程序;2.上交实验报告,实验报告内容如下:(1) 实验名称(2) 实验目的(3) 算法实现的设计方法及程序流程图(4) 程序结果分析【分析与思考】(1) 上述所阐述的三个算法,其基本算法只能适用于直线的斜率(|K|<=1) 的情形,如何将上述算法进行推广,使其能够处理任意斜率的直线?(2) 计算机显示屏幕的坐标圆心在哪里,与我们平时的习惯有什么差异,如何协调二者?实验二 实现Bezier 曲线【实验目的】1、掌握Bezier 曲线的定义;2、能编程实现N 次Bezier 曲线的绘制与显示。

《计算机图形学》实验报告

《计算机图形学》实验报告

《计算机图形学》实验报告目录1实验2:直线的生成 (1)1.1实验要求和目的 (1)1.2实验课时 (1)1.3实验环境 (1)1.4实验内容 (1)1.5核心代码 (3)1.6实验结果 (7)1.6.1DDA算法 (10)1.6.2Mid-Bresenham算法 (11)1.7心得与体会 (12)2实验4:BSpline曲线绘制 (13)2.1实验要求和目的 (13)2.2实验课时 (13)2.3实验环境 (13)2.4实验内容 (13)2.5核心代码 (16)2.6实验结果 (18)2.6.1B-样条算法 (19)2.6.2Bezeir算法 (22)2.7心得与体会 (24)附录 (25)BSpline曲线控制点的测试数据 (25)数据1 (25)数据2 (27)数据3 (29)数据4 (30)数据5 (31)数据6 (33)数据7 (36)数据8 (38)1实验2:直线的生成1.1实验要求和目的理解直线生成的原理;掌握典型直线生成算法;掌握步处理、分析实验数据的能力;编程实现DDA算法、Bresenham中点算法;对于给定起点和终点的直线,分别调用DDA算法和Bresenham中点算法进行批量绘制,并记录两种算法的绘制时间;利用excel 等数据分析软件,将试验结果编制成表格,并绘制折线图比较两种算法的性能。

1.2实验课时3学时1.3实验环境本试验提供自带实验平台·开发环境:Visual C++ 6.0·实验平台:Free_Curve(自制平台)1.4实验内容本实验提供名为 Experiment_Frame_One的平台,该平台提供基本绘制、设置、输入功能,学生在此基础上实现·平台界面:如图1.4.1所示·设置:通过view->setting菜单进入,如图1.4.2所示·输入:通过view->input…菜单进入,如图1.4.3所示·实现算法:▪DDA算法:void CExperiment_Frame_OneView::DDA(int X0, int Y0, int X1, int Y1)▪Mid_Bresenham算法:voidCExperiment_Frame_OneView::Mid_Bresenham(int X0, int Y0, int X1, int Y1)图 1.4.1 总界面图 1.4.2 设置界面图 1.4.3 输入界面1.5核心代码本次实验的核心代码如下所示。

计算机图形学上机实验

计算机图形学上机实验

《计算机图形学》上机实验报告一、实验设计在曲线上按参数t进行for循环200次,每次将ti=i/200代入参数方程计算出一个点。

将这些点连成折线段即可。

glBegin(GL_LINE_STRIP);for(… )glVertex(xi,yi);glEnd();二、关键代码// test4.cpp : 此文件包含 "main" 函数。

程序执行将在此处开始并结束。

//#include"pch.h"#include<cstdio>#include<cmath>#include<GL/glut.h>const GLfloat Pi = 3.1415926536f;//定义点集struct data {GLfloat x;GLfloat y;}Point[201];void init() //初始化函数{glClearColor(1.0, 1.0, 1.0, 0.0); //设置背景颜色glMatrixMode(GL_PROJECTION); // 设置投影参数gluOrtho2D(0.0, 600.0, 0.0, 400.0); // 设置场景的大小}void mydisplay() //显示函数{glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0, 0.0, 0.0); //设置线条颜色glPointSize(2); //设置点的大小glTranslatef(100.0f, 0.0f, 0.0f); //平移图形glScalef(0.5f, 0.5f, 0.0f); //缩小图像0.5倍glRotatef(60.0f, 1.0f, 0.0f, 0.0f); //沿x轴旋转60度glBegin(GL_LINE_STRIP);for (int i = 1; i <= 200; i++){GLfloat t = i / 200.0;Point[i].x = 200.0 + 50.0 * (2.0 * cos(2.0 * Pi*t) - cos(4.0 * Pi*t)); //参数曲线Point[i].y = 150.0 + 50.0 * (2.0 * sin(2.0 * Pi*t) - sin(4.0 * Pi*t)); //参数曲线glVertex2i(Point[i].x, Point[i].y); //绘制曲线}glEnd();glFlush();}int main(int argc, char *argv[]){glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);glutInitWindowPosition(100, 100);glutInitWindowSize(400, 400);glutCreateWindow("绘制曲线及图形变换");init();glutDisplayFunc(&mydisplay);glutMainLoop();return 0;}三、实验结果截图。

上机报告表,计算机图形学

上机报告表,计算机图形学

计算机图形学上机报告上机项目:计算机图形学系别:班级:学号:姓名:上机报告上机项目计算机图形学上机日期指导教师实验地点一、上机目的熟练掌握dda直线生成算法、中点画线法、bresenham画线法、中点画元发、bresenham 画圆法、二维图形变幻的方法、线段裁剪以及bezier曲线参数方程。

画出直线、圆、变换图形、裁剪图形及生成三次bezier曲线。

二、内容用vb实现dda直线生成算法、中点画线法、bresenham画线法、中点画元发、bresenham 画圆法、二维图形变幻的方法、线段裁剪以及bezier曲线参数方程。

分别画出直线、圆、变换图形、裁剪图形及生成三次bezier曲线。

三、上机实现过程(步骤、方法等)根据算法思想及计算方法通过vb实现各个图形的编程及显示。

1、分析算法思想2、编辑程序代码3、运行、纠正直到显示所要结果实验报告四、上机源程序1:Dda直线生成算法(1):Private Sub Command1_Click()Call ddaline(200, 1001, 2000, 3000)Call ddaline(900, 6001, 3000, 1000)Call ddaline(2300, 500, 10000, 4000)Call ddaline(700, 300, 8000, 5000)End SubPublic Sub ddaline(x1, y1, x2, y2 As Integer)Dim x, y, dx, dy, e As Doubledx = x2 - x1: dy = y2 - y1If Abs(dx) > Abs(dy) Thene = Abs(dx)Elsee = Abs(dy)End Ifdx = dx / e: dy = dy / ex = x1: y = y1For i = 0 To ePSet (Int(x + 0.5), Int(y + 0.5))x = x + dxy = y + dyNext iEnd SubDda直线生成算法(2):Public Sub ddaline(ByVal x1 As Integer, ByVal y1 As Integer, ByVal x2 As Integer, ByVal y2 As Integer)Dim x, y, dx, dy, e As Doubledx = x2 - x1: dy = y2 - y1If Abs(dx) > Abs(dy) Thene = Abs(dx)Else: e = Abs(dy)End Ifdx = dx / e: dy = dy / ex = x1: y = y1For i = 0 To ePSet (Int(x + 0.5), Int(y + 0.5))x = x + dx: y = y + dyNext iEnd SubPrivate Sub Command1_Click()Form1.Scale (-ScaleWidth / 2, ScaleHeight / 2)-(ScaleWidth / 2, -ScaleHeight / 2)Dim x(7), y(7) As IntegerFor i = 0 To 7x(i) = Int(Cos(i * 3.14 / 4) * 4000 + 0.5)y(i) = Int(Sin(i * 3.14 / 4) * 4000 + 0.5)Next iFor i = 0 To 6Call ddaline(x(i), y(i), x(i + 1), y(i + 1))Next iCall ddaline(x(0), y(0), x(7), y(7))For i = 0 To 4Call ddaline(x(i), y(i), x(i + 3), y(i + 3))Next iCall ddaline(x(5), y(5), x(0), y(0))Call ddaline(x(6), y(6), x(1), y(1))Call ddaline(x(7), y(7), x(2), y(2))End Sub2:Presenham画线法:Public Sub bresenhamline(x1 As Integer, y1 As Integer, x2 As Integer, y2 As Integer) Dim x, y, p, dx, dy As Integerdx = x2 - x1: dy = y2 - y1: p = 2 * dy - dxx = x1: y = y1For x = x1 To x2PSet (x, y)If p >= 0 Theny = y + 1: p = p + 2 * (dy - dx)Elsep = p + 2 * dyEnd IfNext xEnd SubPrivate Sub Command1_Click()Form1.Scale (-ScaleWidth / 2, ScaleHeight / 2)-(ScaleWidth / 2, -ScaleHeight / 2) Call bresenhamline(-1500, -1500, 2000, 2000)Call bresenhamline(-1900, -1800, -2000, 2000)End Sub3:中点画线法Public Sub midline(x1 As Integer, y1 As Integer, x2 As Integer, y2 As Integer)Dim x, y, d, a, b As Integera = y1 - y2:b = x2 - x1x = x1: y = y1: d = 2 * a + bFor x = x1 To x2PSet (x, y)If d >= 0 Thend = d + 2 * aElsey = y + 1: d = d + 2 * a + 2 * bEnd IfNext xEnd SubPrivate Sub Command1_Click()Form1.Scale (-ScaleWidth / 2, ScaleHeight / 2)-(ScaleWidth / 2, -ScaleHeight / 2) Call midline(-1100, -1500, 4000, 2000)Call midline(-2000, -3000, -4000, 3000)End Sub中点画圆法Private Sub Command1_Click()Call midpointcircle(3000)End SubPrivate Sub Form_Load()Form1.Scale (-ScaleWidth / 2, ScaleHeight / 2)-(ScaleWidth / 2, -ScaleHeight / 2) End SubPublic Sub midpointcircle(R As Integer)Dim d, x, y As Integerd = 1 - R: x = 0: y = RDo While x <= yPSet (x, y)PSet (y, x)PSet (-x, y)PSet (-y, x)PSet (-x, -y)PSet (-y, -x)PSet (x, -y)PSet (y, -x)If d >= 0 Thend = d + 2 * x - 2 * y + 5x = x + 1: y = y - 1Elsed = d + 2 * x + 3x = x + 1End IfLoopEnd SubBresenham画圆法:Private Sub Form_Load()Form1.Scale (-ScaleWidth / 2, ScaleHeight / 2)-(ScaleWidth / 2, -ScaleHeight / 2) End SubPublic Sub midpointcircle(R As Integer)Dim p, x, y As Integerx = 0: y = R: p = 3 - 2 * RDo While x <= yPSet (x, y)PSet (y, x)PSet (-x, y)PSet (-y, x)PSet (-x, -y)PSet (-y, -x)PSet (x, -y)PSet (y, -x)If p >= 0 Thenp = p + 4 * (x - y) + 10x = x + 1: y = y - 1Elsep = p + 4 * x + 6x = x + 1End IfLoopEnd Sub二维坐标变换:Dim x(4), y(4) As IntegerPrivate Sub Command1_Click()Form1.ForeColor = vbBlueCall pingyi(-500, -500)End SubPrivate Sub Command2_Click()Form1.ForeColor = vbBlueCall cuoqie(0, 3)End SubPrivate Sub Command3_Click()Form1.ForeColor = vbBlueCall bili(2, 2)End SubPrivate Sub Command4_Click()Call xuanzhuan(45)End SubPrivate Sub Command5_Click()Call duichen(1, 0, 0, -1)End SubPrivate Sub Form_Load()Form1.Scale (-ScaleWidth / 2, ScaleHeight / 2)-(ScaleWidth / 2, -ScaleHeight / 2) Showx(0) = 500y(0) = 500x(1) = 1500y(1) = 500x(2) = 1500y(2) = 1500x(3) = 500y(3) = 1500Call lianxianEnd SubPublic Sub lianxian()For i = 0 To 2Line (x(i), y(i))-(x(i + 1), y(i + 1))Next iLine (x(3), y(3))-(x(0), y(0))End SubPublic Sub pingyi(tx As Integer, ty As Integer)For i = 0 To 3x(i) = x(i) + txy(i) = y(i) + tyNext iCall lianxianEnd SubPublic Sub cuoqie(b As Single, d As Single)Dim a As IntegerFor i = 0 To 3a = x(i)x(i) = Int(x(i) + b * y(i) + 0.5)y(i) = Int(y(i) + d * a + 0.5)Next iCall lianxianEnd SubPublic Sub bili(sx As Single, sy As Single)For i = 0 To 3x(i) = Int(x(i) * sx + 0.5)y(i) = Int(y(i) * sy + 0.5)Next iCall lianxianEnd SubPublic Sub xuanzhuan(l As Single)Dim a As Integer, b As IntegerFor i = 0 To 3a = x(i):b = y(i)x(i) = Int(a * Cos(l) - b * Sin(l) + 0.5)y(i) = Int(b * Cos(l) + a * Sin(l) + 0.5)Next iCall lianxianEnd SubPublic Sub duichen(a As Integer, b As Integer, d As Integer, e As Integer) Dim m As Integer, n As IntegerFor i = 0 To 3m = x(i): n = y(i)x(i) = Int(a * m + b * n + 0.5)y(i) = Int(d * m + e * n + 0.5)Next iCall lianxianEnd Sub直线段的裁剪:Dim x0, y0, x1, y1 As IntegerDim xl, yb, xr, yt As IntegerPrivate Sub Command1_Click()ForeColor = vbRedCall caijian(2000, 2500, 200, 2000)Call caijian(3000, 2000, 4000, 5000)Call caijian(2500, 1500, 1500, 7000)Call caijian(1500, 2000, 3000, 500)End SubPrivate Sub Form_Load()Showxl = 1000xr = 5000yb = 1000yt = 3000Line (1000, 1000)-(1000, 3000)Line -(5000, 3000)Line -(5000, 1000)Line -(1000, 1000)Line (2000, 2500)-(200, 2000)Line (3000, 2000)-(4000, 5000)Line (2500, 1500)-(1500, 7000)Line (1500, 2000)-(3000, 500)End SubPublic Sub caijian(x0 As Long, y0 As Long, x1 As Long, y1 As Long)If x0 > xl And x0 < xr And y0 > yb And y0 < yt ThenIf x1 > xl And x1 < xr And y1 > yb And y1 < yt ThenLine (x0, y0)-(x1, y1)ElseIf x1 < xl And y1 > yb And y1 < yt Thena = x1x1 = xly1 = Int(((y1 - y0) / (a - x0)) * xl + 0.5) + Int((a * y0 - x0 * y1) / (a - x0) + 0.5) Line (x0, y0)-(x1, y1)End IfIf y1 > yt And x1 < xr And x1 > xl Thena = y1y1 = ytx1 = Int(((yt - (x1 * y0 - x0 * a) / (x1 - x0)) / ((a - y0) / (x1 - x0))) + 0.5)Line (x0, y0)-(x1, y1)End IfIf x1 > xr And y1 > yr And y1 < yt Thena = x1x1 = xry1 = Int(((y1 - y0) / (a - x0)) * xl + 0.5) + Int((a * y0 - x0 * y1) / (a - x0) + 0.5)Line (x0, y0)-(x1, y1)End IfIf y1 < yb And x1 > xl And x1 < xr Thena = y1y1 = ybx1 = Int(((yb - (x1 * y0 - x0 * a) / (x1 - x0)) / ((a - y0) / (x1 - x0))) + 0.5)Line (x0, y0)-(x1, y1)End IfEnd IfEnd IfEnd SubBezier曲线的生成:Private Sub Form_Click()Call bezier3(100, 100, 7000, 200, 9000, 3000, 5000, 600)End SubPublic Sub bezier3(x1 As Integer, y1 As Integer, x2 As Integer, y2 As Integer, x3 As Integer, y3 As Integer, x4 As Integer, y4 As Integer)Dim x(1000), y(1000) As DoubleDim i As IntegerFor i = 0 To 100t = i / 100x(i) = (1 - t) ^ 3 * x1 + 3 * t * (1 - t) ^ 2 * x2 + 3 * t ^ 2 * (1 - t) * x3 + t ^ 3 * x4y(i) = (1 - t) ^ 3 * y1 + 3 * t * (1 - t) ^ 2 * y2 + 3 * t ^ 2 * (1 - t) * y3 + t ^ 3 * y4PSet (Int(x(i) + 0.5), Int(y(i) + 0.5))Next iFor i = 0 To 99Line (x(i), y(i))-(x(i + 1), y(i + 1))Next iEnd Sub五、上机中遇到问题及解决方法运行结果不理想检查算法是否正确检查代码是否出错改正错误六、上机结果Presenham画线法中点画线法: 中点画圆法:Bresenham画圆法:二维坐标变换:直线段裁剪:七、心得体会通过几次实习我学到了很多计算机图形学的实践知识,也了解到编程的一些技巧,深刻的体会到计算机的深奥。

计算机图形学上机报告

计算机图形学上机报告

计算机图形学上机实验报告计算机科学与技术学院班级:学号:姓名:指导教师:完成日期:实验一:基本图元绘制一. 实验目的1. 了解如何利用OpenGL库绘制图形2. 理解glut程序框架3. 理解窗口到视区的变换4. 理解OpenGL实现动画的原理二. 实验内容1. 实现中点Bresenham算法画直线2. 实现改进Bresenham算法画直线3. 实现圆的绘制三. 实验结果1.DDA算法画直线2. 中点Bresenham算法画直线3. 改进Bresenham算法画直线4. Bresenham算法画圆四. 源程序#include <windows.h>#include <gl/glut.h>#include "stdio.h"int m_PointNumber = 0; //动画时绘制点的数目int m_DrawMode = 4; //绘制模式 1 DDA算法画直线// 2 中点Bresenham算法画直线// 3 改进Bresenham算法画直线// 4 八分法绘制圆// 5 四分法绘制椭圆//绘制坐标线void DrawCordinateLine(void){int i = 0 ;//坐标线为黑色glColor3f(0.0f, 0.0f ,0.0f);glBegin(GL_LINES);for (i=10;i<=250;i=i+10){glVertex2f((float)(i), 0.0f);glVertex2f((float)(i), 250.0f);glVertex2f(0.0f, (float)(i));glVertex2f(250.0f, (float)(i));}glEnd();}//绘制一个点,这里用一个正方形表示一个点。

void putpixel(GLsizei x, GLsizei y){glRectf(10*x,10*y,10*x+10,10*y+10);}void DDACreateLine(GLsizei x0, GLsizei y0, GLsizei x1, GLsizei y1, GLsizei num){//设置颜色glColor3f(1.0f,0.0f,0.0f);//对画线动画进行控制if(num == 1)printf("DDA画线算法:各点坐标\n");else if(num==0)return;//画线算法的实现GLsizei dx,dy,epsl,k;GLfloat x,y,xIncre,yIncre;dx = x1-x0;dy = y1-y0;x = x0;y = y0;if(abs(dx) > abs(dy)) epsl = abs(dx);else epsl = abs(dy);xIncre = (float)dx / epsl ;yIncre = (float)dy / epsl ;for(k = 0; k<=epsl; k++){putpixel((int)(x+0.5), (int)(y+0.5));if (k>=num-1) {printf("x=%f,y=%f,取整后x=%d,y=%d\n", x, y, (int)(x+0.5),(int)(y+0.5));break;}x += xIncre;y += yIncre;if(x >= 25 || y >= 25) break;}}void BresenhamLine(GLsizei x0, GLsizei y0, GLsizei x1, GLsizei y1, GLsizei num){glColor3f(1.0f,0.0f,0.0f);if(num == 1)printf("中点Bresenham算法画直线:各点坐标及判别式的值\n");else if(num==0)return;//画线算法的实现GLsizei dx,dy,d,UpIncre,DownIncre,x,y,xend=0;if(x0>x1){x=x1;x1=x0;x0=x;y=y1;y1=y0;y0=y;}x=x0;y=y0;dx=x1-x0;dy=y1-y0;d=dx-2*dy;UpIncre=2*dx-2*dy;DownIncre=-2*dy;while (x<=x1){putpixel(x,y);if (x>=num-1) {break;}x++;if(d<0){y++;d+=UpIncre;}else d+=DownIncre;if(x >= 50 || y >= 50) break;}}void Bresenham2Line(GLsizei x0, GLsizei y0, GLsizei x1, GLsizei y1, GLsizei num) {glColor3f(1.0f,0.0f,0.0f);if(num == 1)printf("改进的Bresenham算法画直线:各点坐标及判别式的值\n");else if(num==0)return;//画线算法的实现GLsizei x,y,dx,dy,e;dx=x1-x0;dy=y1-y0;e=-dx;x=x0;y=y0;while (x<=x1){putpixel(x,y);if (x>=num-1) {break;}x++;e=e+2*dy;if(e>0){y++;e=e-2*dx;}if(x >= 50 || y >= 50) break;}}void BresenhamCircle(GLsizei x, GLsizei y, GLsizei r, GLsizei num){glColor3f(1.0f,0.0f,0.0f);if(num == 1)printf("Bresenham算法画圆:各点坐标及判别式的值\n");x=0,y=r;GLsizei d=1-r;while (x<y){putpixel(x,y);if (x>=num) {break;}putpixel(y,x);if (x>=num) {break;}putpixel(-y,x);if (x>=num) {break;}putpixel(-x,y);if (x>=num) {break;}putpixel(-x,-y);if (x>=num) {break;}putpixel(-y,-x);if (x>=num) {break;}putpixel(y,-x);if (x>=num) {break;}putpixel(x,-y);if(d<0)d+=2*x+3;else{d+=2*(x-y)+5;y--;}x++;}}//初始化窗口void Initial(void){// 设置窗口颜色为蓝色glClearColor(1.0f, 1.0f, 1.0f, 1.0f);}// 窗口大小改变时调用的登记函数void ChangeSize(GLsizei w, GLsizei h){if(h == 0) h = 1;// 设置视区尺寸glViewport(0, 0, w, h);// 重置坐标系统glMatrixMode(GL_PROJECTION);glLoadIdentity();// 建立修剪空间的范围if (w <= h)glOrtho (0.0f, 250.0f, 0.0f, 250.0f*h/w, 1.0, -1.0);elseglOrtho (0.0f, 250.0f*w/h, 0.0f, 250.0f, 1.0, -1.0); }// 在窗口中绘制图形void ReDraw(void){//用当前背景色填充窗口glClear(GL_COLOR_BUFFER_BIT);//画出坐标线DrawCordinateLine();switch(m_DrawMode){case 1:DDACreateLine(0,0,20,15,m_PointNumber);break;case 2:BresenhamLine(0,0,20,15,m_PointNumber);break;case 3:Bresenham2Line(1,1,8,6,m_PointNumber);break;case 4:BresenhamCircle(5,5,18,m_PointNumber);break;default:break;}glFlush();}//设置时间回调函数void TimerFunc(int value){if(m_PointNumber == 0)value = 1;m_PointNumber = value;glutPostRedisplay();glutTimerFunc(500, TimerFunc, value+1);}//设置键盘回调函数void Keyboard(unsigned char key, int x, int y){if (key == '1') m_DrawMode = 1;if (key == '2') m_DrawMode = 2;if (key == '3') m_DrawMode = 3;if (key == '4') m_DrawMode = 4;m_PointNumber = 0;glutPostRedisplay();}//void main(void)int main(int argc, char* argv[]){glutInit(&argc, argv);//初始化GLUT库OpenGL窗口的显示模式glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);glutInitWindowSize(800,600);glutInitWindowPosition(100,100);glutCreateWindow("基本图元绘制程序");glutDisplayFunc(ReDraw);glutReshapeFunc(ChangeSize);glutKeyboardFunc(Keyboard);//键盘响应回调函数glutTimerFunc(500, TimerFunc, 1);// 窗口初始化Initial();glutMainLoop(); //启动主GLUT事件处理循环return 0;}实验二:日地月模型一. 实验目的1. 理解OpenGL中的变换过程2. 理解透视投影与平行投影的不同3. 了解深度测试二. 实验内容1. 通过变换调整观察的位置与方向2. 实现太阳、地球和月亮的运动模型三. 实验结果太阳、地球和月亮的运动模型图1.图2.图3.四. 源程序#include <windows.h>#include <gl/gl.h>#include <gl/glu.h>#include <gl/glut.h>void Initial(){glEnable(GL_DEPTH_TEST); // 启用深度测试glFrontFace(GL_CCW); // 指定逆时针绕法表示多边形正面glClearColor(1.0f, 1.0f, 1.0f, 1.0f ); //背景为白色}void ChangeSize(int w, int h){if(h == 0) h = 1;// 设置视区尺寸glViewport(0, 0, w, h);glMatrixMode(GL_PROJECTION);glLoadIdentity();// 设置修剪空间GLfloat fAspect;fAspect = (float)w/(float)h;gluPerspective(45.0, fAspect, 1.0, 500.0);/*if (w <= h)glOrtho (-nRange, nRange, nRange*h/w, -nRange*h/w, -nRange*2.0f, nRange*2.0f);elseglOrtho (-nRange*w/h, nRange*w/h, nRange, -nRange, -nRange*2.0f, nRange*2.0f); */glMatrixMode(GL_MODELVIEW);glLoadIdentity();}void RenderScene(void){// 绕原子核旋转的角度static float fElect1 = 0.0f;static float f2=0.0f;glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// 重置模型视图矩阵glMatrixMode(GL_MODELVIEW);glLoadIdentity();//将图形沿z轴负向移动glTranslatef(0.0f, 0.0f, -250.0f);// 绘制红色的原子核glColor3f(1.0f, 0.0f, 0.0f);glutSolidSphere(50.0f, 15, 15);// 当前绘制颜色变为黄色glColor3f(0.0f, 0.0f, 0.0f);//绘制第一个电子//保存当前的模型视图矩阵glRotatef(fElect1, 0.0f, 1.0f, 0.0f);//绕y轴旋转一定的角度glTranslatef(80.0f, 0.0f, 0.0f);//平移一段距离glutSolidSphere(12.0f, 15, 15);//画出电子// 恢复矩阵// 第二个电子glPushMatrix();glRotatef(45.0f, 0.0f, 0.0f, 1.0f);glRotatef(f2, 0.0f, 1.0f, 0.0f);glTranslatef(-20.0f, 0.0f, 0.0f);glutSolidSphere(6.0f, 15, 15);glPopMatrix();/* // 第三个电子glPushMatrix();glRotatef(-45.0f,0.0f, 0.0f, 1.0f);glRotatef(fElect1, 0.0f, 1.0f, 0.0f);glTranslatef(0.0f, 0.0f, 60.0f);glutSolidSphere(6.0f, 15, 15);glPopMatrix();*/// 增加旋转步长fElect1 += 10.0f;f2=fElect1*6;if(fElect1 > 360.0f){fElect1 = 10.0f;}glutSwapBuffers();}void TimerFunc(int value){glutPostRedisplay();glutTimerFunc(100, TimerFunc, 1);}int main(int argc, char* argv[]){glutInit(&argc, argv);glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);glutCreateWindow("日地月模型");glutReshapeFunc(ChangeSize);glutDisplayFunc(RenderScene);glutTimerFunc(500, TimerFunc, 1);Initial();glutMainLoop();return 0;}。

计算机图形学实验(全)

计算机图形学实验(全)

实验1 直线的绘制实验目的1、通过实验,进一步理解和掌握DDA和Bresenham算法;2、掌握以上算法生成直线段的基本过程;3、通过编程,会在TC环境下完成用DDA或中点算法实现直线段的绘制。

实验环境计算机、Turbo C或其他C语言程序设计环境实验学时2学时,必做实验。

实验内容用DDA算法或Besenham算法实现斜率k在0和1之间的直线段的绘制。

实验步骤1、算法、原理清晰,有详细的设计步骤;2、依据算法、步骤或程序流程图,用C语言编写源程序;3、编辑源程序并进行调试;4、进行运行测试,并结合情况进行调整;5、对运行结果进行保存与分析;6、把源程序以文件的形式提交;7、按格式书写实验报告。

实验代码:DDA:# include <graphics.h># include <math.h>void DDALine(int x0,int y0,int x1,int y1,int color){int dx,dy,epsl,k;float x,y,xIncre,yIncre;dx=x1-x0;dy=y1-y0;x=x0;y=y0;if(abs(dx)>abs(dy))epsl=abs(dx);elseepsl=abs(dy);xIncre=(float)dx/(float)epsl;yIncre=(float)dy/(float)epsl;for(k=0;k<=epsl;k++){putpixel((int)(x+0.5),(int)(y+0.5),4);x+=xIncre;y+=yIncre;}}main(){int gdriver ,gmode ;gdriver = DETECT;initgraph(&gdriver , &gmode ,"C:\\TC20\\BGI");DDALine(0,0,35,26,4);getch ( );closegraph ( );}Bresenham:#include<graphics.h>#include<math.h>void BresenhamLine(int x0,int y0,int x1,int y1,int color) {int x,y,dx,dy,e;dx=x1-x0;dy=y1-y0;e=-dx;x=x0;y=y0;while(x<=x1){putpixel(x,y,color);x++;e=e+2*dy;if(e>0){y++;e=e-2*dx;}}}main(){int gdriver ,gmode ;gdriver = DETECT;initgraph(&gdriver , &gmode ,"c:\\TC20\\BGI");BresenhamLine(0, 0 , 120, 200,5 );getch ( );closegraph ( );}实验2 圆和椭圆的绘制实验目的1、通过实验,进一步理解和掌握中点算法;2、掌握以上算法生成椭圆或圆的基本过程;3、通过编程,会在TC环境下完成用中点算法实现椭圆或圆的绘制。

计算机图形学实验报告

计算机图形学实验报告

实验结果与结论
• 在本次实验中,我们成功地实现了复杂场景的渲染,得到了具有较高真实感和视觉效果的图像。通过对比 实验前后的效果,我们发现光线追踪和着色器的运用对于提高渲染质量和效率具有重要作用。同时,我们 也发现场景图的构建和渲染脚本的编写对于实现复杂场景的渲染至关重要。此次实验不仅提高了我们对计 算机图形学原理的理解和实践能力,也为我们后续深入研究渲染引擎的实现提供了宝贵经验。
2. 通过属性设置和变换操作,实现了对图形的定 制和调整,加深了对图形属性的理解。
4. 实验的不足之处:由于时间限制,实验只涉及 了基本图形的绘制和变换,未涉及更复杂的图形 处理算法和技术,如光照、纹理映射等。需要在 后续实验中进一步学习和探索。
02
实验二:实现动画效果
实验目的
掌握动画的基本原 理和实现方法
04
实验四:渲染复杂场景
实验目的
掌握渲染复杂场景的基本流程和方法 理解光线追踪和着色器在渲染过程中的作用
熟悉渲染引擎的实现原理和技巧 提高解决实际问题的能力
实验步骤
• 准备场景文件 • 使用3D建模软件(如Blender)创建或导入场景模型,导出为常用的3D格式(如.obj或.fbx)。 • 导入场景文件 • 在渲染引擎(如Unity或Unreal Engine)中导入准备好的场景文件。 • 构建场景图 • 根据场景的层次结构和光照需求,构建场景图(Scene Graph)。 • 设置光照和材质属性 • 为场景中的物体设置光照和材质属性(如漫反射、镜面反射、透明度等)。 • 编写渲染脚本 • 使用编程语言(如C或JavaScript)编写渲染脚本,控制场景中物体的渲染顺序和逻辑。 • 运行渲染程序 • 运行渲染程序,观察渲染结果。根据效果调整光照、材质和渲染逻辑。 • 导出渲染图像 • 将渲染结果导出为图像文件(如JPEG或PNG),进行后续分析和展示。

计算机图形学实验内容

计算机图形学实验内容

计算机图形学实验内容计算机图形学实验肖加清实验一图形学实验基础一、实验目的(1)掌握VC++绘图的一般步骤;(2)掌握OpenGL软件包的安装方法;(3)掌握OpenGL绘图的一般步骤;(4)掌握OpenGL的主要功能与基本语法。

二、实验内容1、VC++绘图实验(1)实验内容:以下是绘制金刚石图案。

已给出VC++参考程序,但里面有部分错误,请改正,实现以下图案。

N=3N=4N=5N=10CP2();virtual ~CP2();CP2(double,double);double x;double y;};CP2::CP2(){this->x=0.0;this->y=0.0;}CP2::~CP2(){}CP2::CP2(double x0,double y0) {this->x=x0;this->y=y0;}//视图类的一个成员函数,这个成员函数可以放在OnDraw函数里调用。

//在视图类的头文件(.h)里定义此函数void Diamond();//在视图类的实现文件(.cpp)里实现此函数void CTestView::Diamond(){CP2 *P;int N;double R;R=300;N=10;P=new CP2[N];CClientDC dc(this);CRect Rect;GetClientRect(&Rect);double theta;theta=2*PI/N;for(int i=0;i<N;i++){P[i].x=R*cos(i*theta);P[i].y=R*sin(i*theta);}for(i=0;i<=N-2;i++){for(int j=i+1;j<=N-1;j++){//其中ROUND函数需要自己实现,实现四舍五入的功能。

dc.MoveTo(ROUND(P[i].x+Rect.right/2),RO UND(P[i].y+Rect.bottom/2));dc.LineTo(ROUND(P[j].x+Rect.right/2),RO UND(P[j].y+Rect.bottom/2));}}delete []P;}2、OpenGL绘图(1)以下是用OpenGL绘制茶壶的代码,请在OpenGL环境下运行,分析OpenGL程序的结构#include <windows.h>#include <GL/gl.h>#include <GL/glu.h>#include <GL/glaux.h>//定义输出窗口的大小#define WINDOW_HEIGHT 300#define WINDOW_WIDTH 500//用户初始化函数void myninit(void);//窗口大小变化时的回调函数void CALLBACK myReshape(GLsizei w,GLsizei h);//每帧OpenGL都会调用这个函数,应该把显示代码放在这个函数中void CALLBACK display(void);int window_width=WINDOW_WIDTH;int window_height=WINDOW_HEIGHT;//视点离物体的距离float distance=3.6f;//初始化,此时为空,可以在这里进行初始化操作void myinit(void){}void CALLBACK display(void){//设置清屏的颜色,并清屏和深度缓冲glClearColor(0.0f,0.0f,0.0f,0.0f);glClear(GL_COLOR_BUFFER_BIT|GL_ DEPTH_BUFFER_BIT);//设置成模型矩阵模式glMatrixMode(GL_MODELVIEW);//载入单位化矩阵glLoadIdentity();//坐标中心向Z轴平移-distance,这样使坐标中心位于视点前方glTranslatef(0.0,0.0,-distance);//在坐标中心显示一个茶壶auxWireTeapot(1.0);//等待现有的OpenGL命令执行完成glFlush();//交换前后缓冲区auxSwapBuffers();}void CALLBACK myReshape(GLsizei w,GLsizei h){if(!h) return ;//这定视区glViewport(0,0,w,h);//设定透视方式glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(60.0,1.0*(GLfloat)w/(GLflo at)h,1.0,30.0);window_width=w;window_height=h;}//移近移远的回调函数void CALLBACK MoveNear(void){distance-=0.3f;}void CALLBACK MoveFar(void){distance +=0.3f;}//主函数int main(int argc,char **argv){//初始化OpenGL的显示方式auxInitDisplayMode(AUX_DOUBLE|AUX _RGB|AUX_DEPTH16);//设定OpenGL窗口位置和大小auxInitPosition(0,0,WINDOW_WIDTH,W INDOW_HEIGHT);//打开窗口auxInitWindow("OpenGL的一个简单的例子!");//调用初始化函数myinit();//设定窗口大小变化的回调函数auxReshapeFunc(myReshape);//设定移动视点的回调函数auxKeyFunc('A',MoveNear); //按A键变大auxKeyFunc('a',MoveFar); //按a键变小//使display函数一直被调用auxIdleFunc(display);//开始OpenGL的循环auxMainLoop(display);//结束程序return (0);}其运行结果如图所示:(2)OPENGL绘制矩形的简单例子参考程序:#include <gl/glut.h>void Initial(void){glClearColor(1.0f, 1.0f, 1.0f, 1.0f); //设置窗口背景颜色为白色glMatrixMode(GL_PROJECTION);//设置投影参数gluOrtho2D(0.0,200.0,0.0,150.0);}void Display(void){glClear(GL_COLOR_BUFFER_BIT); //用当前背景色填充窗口glColor3f(1.0f, 0.0f, 0.0f); //设置当前的绘图颜色为红色glRectf(50.0f, 100.0f, 150.0f, 50.0f); //绘制一个矩形glFlush(); //处理所有的OpenGL程序}int main(int argc, char* argv[]){glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); //初始化窗口的显示模式glutInitWindowSize(400,300);//设置窗口的尺寸glutInitWindowPosition(100,120);//设置窗口的位置glutCreateWindow("矩形"); //创建一个名为矩形的窗口glutDisplayFunc(Display);//设置当前窗口的显示回调函数Initial();//完成窗口初始化glutMainLoop();//启动主GLUT事件处理循环return 0;}三、实验结果分析实验二直线生成算法与用户接口与交互式技术一、实验目的1、掌握直线生成算法(1)DDA算法(2)Bresenham算法2、掌握交互式技术(1)鼠标(2)键盘数字键、字母键、功能键和特殊键3、实现拾取操作二、实验内容1、以下给出了DDA算法的C++代码,请参考用Visual C++实现Bresenham算法。

计算机图形学实验报告

计算机图形学实验报告

姓名:学号:目录实验一直线的DDA算法一、【实验目的】1.掌握DDA算法的基本原理。

2.掌握DDA直线扫描转换算法。

3.深入了解直线扫描转换的编程思想。

二、【实验内容】1.利用DDA的算法原理,编程实现对直线的扫描转换。

2.加强对DDA算法的理解和掌握。

三、【测试数据及其结果】四、【实验源代码】#include<stdlib.h>#include<math.h>#include<GL/glut.h>#include<stdio.h>GLsizei winWidth=500;GLsizei winHeight=500;void Initial(void){glClearColor(1.0f,1.0f,1.0f,1.0f); glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0,200.0,0.0,150.0);}void DDALine(int x0,int y0,int x1,int y1) {glColor3f(1.0,0.0,0.0);int dx,dy,epsl,k;float x,y,xIncre,yIncre;dx=x1-x0; dy=y1-y0;x=x0; y=y0;if(abs(dx)>abs(dy)) epsl=abs(dx); else epsl=abs(dy);xIncre=(float)dx/(float)epsl;yIncre=(float)dy/(float)epsl;for(k=0;k<=epsl;k++){glPointSize(3);glBegin(GL_POINTS);glVertex2i(int(x+0.5),(int)(y+0.5));glEnd();x+=xIncre;y+=yIncre;}}void Display(void){glClear(GL_COLOR_BUFFER_BIT); DDALine(100,100,200,180); glFlush();}void winReshapeFcn(GLint newWidth, GLint newHeight){glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0.0, GLdouble(newWidth), 0.0, GLdouble(newHeight));glClear(GL_COLOR_BUFFER_BIT);winWidth=newWidth;winHeight=newHeight;}int main(int argc,char*argv[]){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowSize(400,300);glutInitWindowPosition(100,120);glutCreateWindow("line");Initial();glutDisplayFunc(Display);glutReshapeFunc(winReshapeFcn);glutMainLoop();return 0;}实验二Bresenham绘制直线和圆一、【实验目的】1.掌握Bresenham算法扫描转换圆和直线的基本原理。

计算机图形学作业实验报告

计算机图形学作业实验报告

计算机图形学实验报告班级:学号:姓名:指导教师:完成日期:实验一:多边形填充一、实验目的了解多边形属性,熟悉相关函数的调用。

二、实验内容步骤和实现:首先进行初始化工作,进行显示模式(单缓冲区)和窗口等设定,主要实现根据两个函数,一个是指定场景绘制函数,glutDisplayFunc(Paint),paint函数中设置了两个三角形,一个填充,一个不填充。

用到了启用多边形点画模式glEnable(GL_POL YGON_STIPPLE)的函数,和指定多边形点画模式(填充) glPolygonStipple(fly)的函数。

另外一个就是循环执行OpenGl命令的glutMainLoop()函数。

三、实验结果四、源程序// POL Y_STIPPLE.C#include <gl/glut.h>void makeObject() // 定义一个三角形{ glBegin(GL_TRIANGLES); // 开始定义三角形// 按逆时针方向指定三角形的顶点坐标glVertex2f(-0.95, -0.95);glVertex2f(0.95, -0.95);glVertex2f(0, 0.95);glEnd(); // 三角形定义结束}void display(){ GLsizei w = glutGet(GLUT_WINDOW_WIDTH); // 程序窗口宽度GLsizei h = glutGet(GLUT_WINDOW_HEIGHT); // 程序窗口高度GLubyte fly[] = // 第二个三角形点画模式的mask值{ 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, // 0X03, 0X80, 0X01, 0XC0, 0X06, 0XC0, 0X03, 0X60, //0X04, 0X60, 0X06, 0X20, 0X04, 0X30, 0X0C, 0X20, //0X04, 0X18, 0X18, 0X20, 0X04, 0X0C, 0X30, 0X20, //0X04, 0X06, 0X60, 0X20, 0X44, 0X03, 0XC0, 0X22, //0X44, 0X01, 0X80, 0X22, 0X44, 0X01, 0X80, 0X22, //0X44, 0X01, 0X80, 0X22, 0X44, 0X01, 0X80, 0X22, //0X44, 0X01, 0X80, 0X22, 0X44, 0X01, 0X80, 0X22, //0X66, 0X01, 0X80, 0X66, 0X33, 0X01, 0X80, 0XCC, //0X19, 0X81, 0X81, 0X98, 0X0C, 0XC1, 0X83, 0X30, //0X07, 0XE1, 0X87, 0XE0, 0X03, 0X3F, 0XFC, 0XC0, //0X03, 0X31, 0X8C, 0XC0, 0X03, 0X33, 0XCC, 0XC0, //0X06, 0X64, 0X26, 0X60, 0X0C, 0XCC, 0X33, 0X30, //0X18, 0XCC, 0X33, 0X18, 0X10, 0XC4, 0X23, 0X08, //0X10, 0X63, 0XC6, 0X08, 0X10, 0X30, 0X0C, 0X08, //0X10, 0X18, 0X18, 0X08, 0X10, 0X00, 0X00, 0X08 };glClear(GL_COLOR_BUFFER_BIT); // 清除颜色缓冲区glViewport(0, 0, w / 2, h); // 第一个视口,显示第一个三角形glColor3f(1, 1, 1); // 设置颜色,白色,默认值makeObject(); // 第一个三角形glViewport(w / 2, 0, w / 2, h); // 第二个视口,显示第二个三角形glColor3f(1, 0, 0); // 设置颜色,红色glEnable(GL_POL YGON_STIPPLE); // 启用多边形点画模式glPolygonStipple(fly); // 指定多边形点画模式(填充)makeObject(); // 第二个三角形glDisable(GL_POL YGON_STIPPLE); // 关闭多边形点画模式glFlush(); // 强制OpenGL命令序列在有限的时间内完成执行}int main(){ glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);// 设置程序窗口的显示模式(单缓冲区、RGBA颜色模型)glutInitWindowPosition(100, 100); // 程序窗口的位置glutInitWindowSize(300, 150); // 程序窗口的大小glutCreateWindow("一个填充多边形的例子!"); // 窗口的标题glutDisplayFunc(display); // 指定场景绘制函数glutMainLoop(); // 开始循环执行OpenGL命令}实验二:基本图元绘制二、实验目的了解OpenGL图形软件包绘制图形的基本过程及其程序框架,并在已有的程序框架中添加代码实现直线和圆的生成算法,演示直线和圆的生成过程,从而加深对直线和圆等基本图形生成算法的理解。

计算机图形学实验报告

计算机图形学实验报告

计算机图形学实验报告计算机图形学实验报告引言计算机图形学是研究计算机生成和处理图像的学科,它在现代科技和娱乐产业中扮演着重要的角色。

本实验报告旨在总结和分享我在计算机图形学实验中的经验和收获。

一、实验背景计算机图形学实验是计算机科学与技术专业的一门重要课程,通过实践操作和编程,学生可以深入了解图形学的基本原理和算法。

本次实验主要涉及三维图形的建模、渲染和动画。

二、实验内容1. 三维图形建模在实验中,我们学习了三维图形的表示和建模方法。

通过使用OpenGL或其他图形库,我们可以创建基本的几何体,如立方体、球体和圆柱体,并进行变换操作,如平移、旋转和缩放。

这些基本操作为后续的图形处理和渲染打下了基础。

2. 光照和着色光照和着色是图形学中重要的概念。

我们学习了不同的光照模型,如环境光、漫反射和镜面反射,并了解了如何在三维场景中模拟光照效果。

通过设置材质属性和光源参数,我们可以实现逼真的光照效果,使物体看起来更加真实。

3. 纹理映射纹理映射是一种将二维图像映射到三维物体表面的技术。

通过将纹理图像与物体的顶点坐标相对应,我们可以实现更加细致的渲染效果。

在实验中,我们学习了纹理坐标的计算和纹理映射的应用,使物体表面呈现出具有纹理和细节的效果。

4. 动画和交互动画和交互是计算机图形学的重要应用领域。

在实验中,我们学习了基本的动画原理和算法,如关键帧动画和插值技术。

通过设置动画参数和交互控制,我们可以实现物体的平滑移动和变形效果,提升用户体验。

三、实验过程在实验过程中,我们首先熟悉了图形库的使用和基本的编程技巧。

然后,我们按照实验指导书的要求,逐步完成了三维图形建模、光照和着色、纹理映射以及动画和交互等任务。

在实验过程中,我们遇到了许多挑战和问题,但通过不断的尝试和调试,最终成功实现了预期的效果。

四、实验结果通过实验,我们成功实现了三维图形的建模、渲染和动画效果。

我们可以通过键盘和鼠标控制物体的移动和变形,同时观察到真实的光照效果和纹理映射效果。

计算机图形学上机报告

计算机图形学上机报告

计算机图形学上机实验报告—计算机科学与技术学院】【班级:学号:姓名:指导教师:完成日期:|实验一:基本图元绘制一. 实验目的1. 了解如何利用OpenGL库绘制图形:2. 理解glut程序框架3. 理解窗口到视区的变换4. 理解OpenGL实现动画的原理二. 实验内容,1. 实现中点Bresenham算法画直线2. 实现改进Bresenham算法画直线3. 实现圆的绘制三. 实验结果¥算法画直线2. 中点Bresenham算法画直线>3. 改进Bresenham算法画直线4. Bresenham算法画圆|四. 源程序#include <>&#include <gl/>#include ""int m_PointNumber = 0; 实验目的1. 理解OpenGL中的变换过程|2. 理解透视投影与平行投影的不同3. 了解深度测试二. 实验内容1. 通过变换调整观察的位置与方向]2. 实现太阳、地球和月亮的运动模型三. 实验结果太阳、地球和月亮的运动模型图1.$|/图2. ~图3.:四. 源程序#include <>#include <gl/>#include <gl/>…#include <gl/>void Initial(){glEnable(GL_DEPTH_TEST); // 启用深度测试(glFrontFace(GL_CCW); // 指定逆时针绕法表示多边形正面glClearColor, , , ); //背景为白色}{void ChangeSize(int w, int h){if(h == 0) h = 1;// 设置视区尺寸;glViewport(0, 0, w, h);glMatrixMode(GL_PROJECTION);glLoadIdentity();…// 设置修剪空间GLfloat fAspect;fAspect = (float)w/(float)h;gluPerspective, fAspect, , ;/*}if (w <= h)glOrtho (-nRange, nRange, nRange*h/w, -nRange*h/w, -nRange*, nRange*;elseglOrtho (-nRange*w/h, nRange*w/h, nRange, -nRange, -nRange*, nRange*; */》glMatrixMode(GL_MODELVIEW);glLoadIdentity();})void RenderScene(void){// 绕原子核旋转的角度static float fElect1 = ;static float f2=;…glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// 重置模型视图矩阵glMatrixMode(GL_MODELVIEW);glLoadIdentity();$//将图形沿z轴负向移动glTranslatef, , ;// 绘制红色的原子核*glColor3f, , ;glutSolidSphere, 15, 15);// 当前绘制颜色变为黄色glColor3f, , ;<//绘制第一个电子//保存当前的模型视图矩阵glRotatef(fElect1, , , ;//绕y轴旋转一定的角度"glTranslatef, , ;//平移一段距离glutSolidSphere, 15, 15);//画出电子// 恢复矩阵!// 第二个电子glPushMatrix();glRotatef, , , ;glRotatef(f2, , , ;'glTranslatef, , ;glutSolidSphere, 15, 15);glPopMatrix();/* // 第三个电子glPushMatrix();!glRotatef,, , ;glRotatef(fElect1, , , ;glTranslatef, , ;glutSolidSphere, 15, 15);glPopMatrix();*/// 增加旋转步长fElect1 += ;f2=fElect1*6;if(fElect1 > {fElect1 = ;}glutSwapBuffers();}void TimerFunc(int value){glutPostRedisplay();glutTimerFunc(100, TimerFunc, 1);}int main(int argc, char* argv[]){glutInit(&argc, argv);glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);glutCreateWindow("日地月模型");glutReshapeFunc(ChangeSize);glutDisplayFunc(RenderScene);glutTimerFunc(500, TimerFunc, 1);Initial();glutMainLoop();return 0;}。

计算机图形学上机实验报告模板

计算机图形学上机实验报告模板

计算机图形学上机实验报告实验名称:线画图元生成中国石油大学(北京)信息学院计算机科学与技术系班级:计算机08-2班学号:2008082207姓名:周新完成日期:2011-10-23实验一:基本图元绘制一、实验目的与要求(1)理解glut程序框架(2)理解窗口到视区的变换(3)理解OpenGL实现动画的原理(5)添加代码实现“Bresenham算法画直线”(6)添加代码实现圆的绘制(可以适当对框架坐标系进行修改)(7)适当修改代码实现具有宽度的图形(线刷子或方刷子)二、实验内容(算法设计)1.算法流程图和主要数据结构:(1)中点椭圆算法的程序流程图(2)主要数据结构:vector<CPoint>作为存储计算出的点2.关键代码实现(1)DDA算法//DDA算法//参数:bePoint为起点坐标,endPoint为终点坐标void CGraphicsView::DDACreateLine(CPoint bePoint,CPoint endPoint){//画线算法的实现int dx,dy,epsl,k;float x,y,xIncre,yIncre;int bptx=(int)bePoint.x;int bpty=(int)bePoint.y;int eptx=(int)endPoint.x;int epty=(int)endPoint.y;dx = eptx-bptx;dy = epty-bpty;x = bptx;y = bpty;if(abs(dx) > abs(dy)){epsl = abs(dx);}else {epsl = abs(dy);}xIncre = (float)dx /epsl;//x增加步长yIncre = (float)dy /epsl;//y增加步长for(k = 0; k<=epsl; k++){ptList.push_back(CPoint((int)x,(int)y));//将算出的点坐标取整并加入ptList尾部x += xIncre;y += yIncre;}}(2)Bresenham画线算法//中点Bresenham算法画直线(0<=k<=1)//参数:bePoint为起点,endPoint为终点void CGraphicsView::BresenhamLine(CPoint bePoint, CPoint endPoint){int dx,dy,d,upIncre,downIncre,x,y,k=0;int bptx=(int)bePoint.x;int bpty=(int)bePoint.y;int eptx=(int)endPoint.x;int epty=(int)endPoint.y;if(bptx>eptx){x=eptx;eptx=bptx;bptx=x;y=epty;epty=bpty;bpty=y;}x=bptx;y=bpty;dx=eptx-bptx;dy=epty-bpty;d=dx-2*dy;upIncre=2*dx-2*dy;downIncre=-2*dy;//算法实现while(x<eptx){ptList.push_back(CPoint(x,y));//将算出的点坐标取整并加入ptList尾部x++;if(d<0){y++;d+=upIncre;}elsed+=downIncre;}}(3)改进Bresenham画线算法//改进的Bresenham算法画直线(0<=k<=1)//参数:bePoint为起点,endPoint为终点void CGraphicsView::BresenhamImpro(CPoint bePoint, CPoint endPoint) {int x,y,dx,dy,e,k=0;int bptx=(int)bePoint.x;int bpty=(int)bePoint.y;int eptx=(int)endPoint.x;int epty=(int)endPoint.y;dx=eptx-bptx;dy=epty-bpty;e=-dx;x=bptx;y=bpty;while(x<=eptx){ptList.push_back(CPoint(x,y));k++;x++;e=e+2*dy;if(e>0){y++;e=e-2*dx;}}}(4)Bresenham画中点圆//中点圆算法//参数:cirCenter为圆心点,cirEdge为圆周上一点void CGraphicsView::BCircle(CPoint cirCenter, CPoint cirEdge){int d,k=0,xa,ya;int bptx=(int)cirCenter.x;int bpty=(int)cirCenter.y;int eptx=(int)cirEdge.x;int epty=(int)cirEdge.y;int R=sqrt(pow((bptx-eptx),2)+pow((bpty-epty),2));xa=0;ya=R;d=1-R;while(xa<=ya){ptList.push_back(CPoint(xa+bptx,ya+bpty));ptList.push_back(CPoint(ya+bptx,xa+bpty));ptList.push_back(CPoint(-ya+bptx,xa+bpty));ptList.push_back(CPoint(-xa+bptx,ya+bpty));ptList.push_back(CPoint(-xa+bptx,-ya+bpty));ptList.push_back(CPoint(-ya+bptx,-xa+bpty));ptList.push_back(CPoint(ya+bptx,-xa+bpty));ptList.push_back(CPoint(xa+bptx,-ya+bpty));if(d<0)d+=2*xa+3;else{d+=2*(xa-ya)+5;ya--;}xa++;}}(5)Bresenham画中点椭圆while(pow(rb,2)*x<=pow(ra,2)*y){ptList.push_back(CPoint(x+cx,y+cy));ptList.push_back(CPoint(-x+cx,y+cy));ptList.push_back(CPoint(x+cx,-y+cy));ptList.push_back(CPoint(-x+cx,-y+cy));double temp1=2*pow(rb,2)*x+2*pow(rb,2);//定义临时变量,以方便p1的计算double temp2=2*pow(ra,2)*y-2*pow(ra,2);if(p1<0){p1+=temp1+pow(rb,2);}else{p1+=temp1-temp2+pow(rb,2);y--;}x++;}//计算第二区域内点p2=pow(rb,2)*pow((x+(double)1/2),2)+pow(ra,2)*(y-1)-pow(ra,2)*pow(rb,2);while(x<=ra&&y>=0){ptList.push_back(CPoint(x+cx,y+cy));ptList.push_back(CPoint(-x+cx,y+cy));ptList.push_back(CPoint(x+cx,-y+cy));ptList.push_back(CPoint(-x+cx,-y+cy));if(p2>0){y--;p2=p2-2*pow(ra,2)*y+pow(ra,2);}else{y--;x++;p2=p2+2*pow(rb,2)*x-2*pow(ra,2)*y+pow(ra,2);}(6)时钟控制器OnTimerCMainFrame *mainframe=(CMainFrame *)(AfxGetApp()->m_pMainWnd);//定义获取主窗口的指针int mode=mainframe->algoMode;//将从主窗口获取的算法选择变量赋值给临时变量if(4==mode||5==mode)//根据算法选择决定画点的顺序,4或5时为圆或椭圆{for(int i=0;i<8;i++)//画圆或椭圆时,每次画8个点{if(po intID<=(ptList.size()-1)){if(10>=abs(ptList[pointID].x)&&10>=abs(ptList[pointID].y)){DrawPoint(ptList[pointID]);//画一个点的函数pointID++;//定义好的全局变量,记录画点的个数}}else{KillTimer(nIDEvent);//杀掉计时器}}}else//画线时,每次只画一个点{if(pointID<=(ptList.size()-1)){DrawPoint(ptList[pointID]);pointID++;}else{KillTimer(nIDEvent);}}(7)通过点击鼠标左键来获取点坐标OnLButtonDown pDC->DPtoLP(&point);//设备坐标转化为逻辑坐标switch(lButtonDown) {case 0:ptBegin=point;//将获取到的逻辑坐标赋值给已定义的起点lButtonDown+=1;//定义的类的成员变量,左键次数加1break;case 1:ptEnd=point; //将获取到的逻辑坐标赋值给已定义的终点lButtonDown+=1;break;case 2:radiumpt=point;//该点为画椭圆是特有的点,作为椭圆的右顶点lButtonDown+=1;default:break;}(8)窗口视图的模式映射CRect rectClient;GetClientRect(rectClient);//获得当前窗口的客户区大小pDC->SetMapMode(MM_ISOTROPIC);//设置映射模式pDC->SetWindowExt(21,21);//设置窗口范围pDC->SetViewportExt(rectClient.right,-rectClient.bottom);//设置视口范围pDC->SetViewportOrg(rectClient.right/2,rectClient.bottom/2);//设置视口原点三、实验结果1.DDA算法画直线2、Bresenham画线3、改进Bresenham画线4 Bresenham画中点圆5 Bresenham画中点椭圆(1)画刷为正方形(2)画刷为圆形四、实验讨论与体会体会:通过本次实验,让我了解到了上文提到的几种算法实现的具体过程,并且通过动态画线,对几种算法生成线的过程和特点也有个更进一步的学习和掌握。

图形学上机实验报告

图形学上机实验报告

计算机图形学上机实验报告计算机科学与技术学院班级:CS13 班学号:U姓名:指导教师:完成日期:2015/11/15实验一:kock分形雪花图案的绘制一、实验目的与要求目的:1.通过实验初步了解OPENGL。

2通过上机编程掌握OPENGL的画图机理和OPENGL。

要求:1.了解分形绘图的过程。

二、实验内容以Kock曲线为例,说明分形图形是如何生成的。

Kock曲线的初始生成元是一条直线段,生成规则是将直线段均分为三等分,首尾两端保持不变,中间用两端等长且互成60度角的直线段代替。

迭代公式如下:分别迭代1,3,6次,并记录结果。

三、实验结果实验结果图如下:3-1第一次分形3-2三次分形3-3六次分形四、体会通过这次实验了解到了分形系统的从图元到图形的形成过,分形在图形学的应用中,可以用来表示岩层、云、水、树、等。

并且亲手实现了“雪花”的分形图形。

通过迭代次数可控制图形的不同。

掌握了分形系统的形成过程。

完成了此次试验目的。

五、源程序void drawline(pt pt1, pt pt2)//绘制线{glBegin(GL_LINES);glVertex2d(pt1.x, pt1.y);glVertex2d(pt2.x, pt2.y);glEnd();}void drawkoch(pt pt1, pt pt2, int n)//n为确定的迭代次数{pt p1, p2, p3, p4, p5;glColor3f(0.0, 0.0, 0.0);p1.x = pt1.x;p1.y = pt1.y;p2.x = pt2.x;p2.y = pt2.y;if (n == 1){ drawline(p1, p2); }if (n>1){p3.x = p1.x + (-p1.x + p2.x) / 3;p3.y = p1.y + (-p1.y + p2.y) / 3;p4.x = p1.x + 2 * (-p1.x + p2.x) / 3;p4.y = p1.y + 2 * (-p1.y + p2.y) / 3;p5.x = (p4.x - p3.x) / 2 - (p4.y - p3.y)*sqrt(3.0) / 2 + p3.x;p5.y = (p4.y - p3.y) / 2 + (p4.x - p3.x)*sqrt(3.0) / 2 + p3.y;drawkoch(p1, p3, n - 1);drawkoch(p3, p5, n - 1);drawkoch(p5, p4, n - 1);drawkoch(p4, p2, n - 1);}if (n == 0)exit(0);}void display(void){glClear(GL_COLOR_BUFFER_BIT);pt p1, p2, p3;p1.x = 30;p1.y = 30;p2.x = 110;p2.y = 30;p3.x = 70;p3.y = 30 + 40 * sqrt(3.0);int n;do{//循环改变迭代次数glClear(GL_COLOR_BUFFER_BIT);printf("请输入Koch雪花的迭代次数,或输入0退出:");scanf("%d", &n);drawkoch(p1, p3, n);drawkoch(p3, p2, n);drawkoch(p2, p1, n);glFlush();} while (n != 0);}int main(int argc, char**argv){glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);glutInitWindowPosition(50, 100);glutInitWindowSize(500, 400);glutCreateWindow("KOCHCURVE");init();glutDisplayFunc(display);glutMainLoop();return 0;}实验二:星球环绕模型一、实验目的与要求目的:1.通过实验初步了解OpenGL中的深度测试缓存器算法。

计算机图形学实验报告

计算机图形学实验报告

计算机图形学实验报告一、实验目的本次计算机图形学实验旨在深入了解和掌握计算机图形学的基本原理、算法和技术,通过实际操作和编程实现,提高对图形生成、处理和显示的能力,培养解决实际图形问题的思维和实践能力。

二、实验环境本次实验使用的编程语言为 Python,借助了相关的图形库如Pygame 或 matplotlib 等。

开发环境为 PyCharm 或 Jupyter Notebook。

三、实验内容(一)二维图形的绘制1、直线的绘制使用 DDA(Digital Differential Analyzer)算法或 Bresenham 算法实现直线的绘制。

通过给定直线的起点和终点坐标,在屏幕或图像上绘制出直线。

比较两种算法的效率和准确性,分析其优缺点。

2、圆的绘制采用中点画圆算法或 Bresenham 画圆算法绘制圆。

给定圆心坐标和半径,生成圆的图形。

研究不同半径大小对绘制效果和计算复杂度的影响。

(二)图形的填充1、多边形填充实现扫描线填充算法,对任意多边形进行填充。

处理多边形的顶点排序、交点计算和填充颜色的设置。

测试不同形状和复杂度的多边形填充效果。

2、图案填充设计自定义的填充图案,如纹理、条纹等,并将其应用于图形填充。

探索如何通过改变填充图案的参数来实现不同的视觉效果。

(三)图形的变换1、平移、旋转和缩放对已绘制的图形(如矩形、三角形等)进行平移、旋转和缩放操作。

通过矩阵运算实现这些变换。

观察变换前后图形的位置、形状和方向的变化。

2、组合变换将多个变换组合应用于图形,如先旋转再平移,或先缩放再旋转等。

分析组合变换的顺序对最终图形效果的影响。

(四)三维图形的表示与绘制1、三维坐标变换学习三维空间中的平移、旋转和缩放变换矩阵,并将其应用于三维点的坐标变换。

理解如何将三维坐标映射到二维屏幕上显示。

2、简单三维图形绘制尝试绘制简单的三维图形,如立方体、球体等,使用线框模型或表面模型。

探讨不同的绘制方法和视角对三维图形显示的影响。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

计算机图形学上机实验
齐金山
淮阴师范学院(江苏)
计算机科学与技术学院
计算机图形学上机说明
《计算机图形学》是计算机科学与技术专业本科的一门专业课程,课程的上机实践性环节是学生学习的重点和难点。

通过本实验,使学生掌握计算机图形学的基本原理、方法和相关的软硬件知识,掌握计算机图形学编程的基本方法,为学生进一步学习图形学及其他相关学科打下坚实的基础。

要求掌握计算机图形学的基本原理、算法与应用;学会用相关算法编程显示基本图形。

本次共有4次上机实验,涉及到计算机基本图形的生成算法、扫描填充算法、裁剪算法、几何变换和曲线等内容。

学生平时也可以去了解三维图形建模技术(曲面、体模型)、OpenGL、光照消隐、三维技术(模型显示、光照、雾化、交互)等知识。

4次上机实验成果要求提交源代码?!。

相关文档
最新文档