计算机图形学上机报告模板(9)

合集下载

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

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

巢湖学院计算机图形学实验报告(模板>本课程实验包括:以下为实验二和实验三模板实验一:基本图元绘制一、实验目的了解OpenGL图形软件包绘制图形的基本过程及其程序框架,并在已有的程序框架中添加代码实现直线和圆的生成算法,演示直线和圆的生成过程,从而加深对直线和圆等基本图形生成算法的理解。

b5E2RGbCAP二、实验内容实验操作和步骤:本次实验主要的目的是为了掌握基本画线和画圆算法,对于书上给出的代码,要求通过本次实验来具体的实现。

由于实验已经给出大体的框架,所以只需要按照书上的算法思想来设计具体实现代码,对于直线DDA算法,中点Bresenham算法及其改进算法,以及Bresenham画圆算法都有进一步的体会。

DDA算法是对每一步都要进行增量处理,然后取整,绘制,而Bresenham通过判断误差函数和求取递推公式来实现。

特别是对于整数的选择取舍,以及代码的流程和循环的控制有一个深入的了解。

同时也熟练运用OpenGL基本的绘图函数。

p1EanqFDPw三、体会通过本次实验,我进一步加深了对于基本画图算法的理解。

特别是对于DDA,Bresenham和画圆算法。

其中,DDA算法由于每一步都要处理浮点数的四舍五入,所以在绘图时要进行取整,效率较低,但是代码直观好懂,符合原理。

而对于Bresenham及其改进算法,都是在理论推导的基础上来实现的,然后经过整数化,形成了一个高效率的画图算法,所以需要适当的理解,特别是对于取整操作判断比较巧妙,实现了避免多次判断计算浮点数的目的,所以比较高效。

而绘制圆形的时候,用到的基本思想还是和Bresenham画图算法一样,只不过需要注意的是八分法画圆,这样只需要绘制其中的八分之一就可以利用对称的关系来绘制出整个图形。

而对于是否走下一步,或者是停留,判断的依据还是误差函数,和前面的思想是类似。

另外,通过实验训练了自己的编程能力,同时熟悉了OpenGL绘图的函数和流程,也进一步巩固了相关的知识。

计算机图形学第一次上机实验报告

计算机图形学第一次上机实验报告

计算机图形学上机实验报告实验名称:用DDA算法生成直线姓名:***班级:信息与计算科学学号:**********一:DDA 算法的思想精髓实现直线段光栅化的最简单的方法就是解直线的微分方程。

设直线的起点坐标为 (x s , y s ),终点坐标为 (x e , y e ),那么该直线的微分方程是:()m x x y y dx dy se s e =--=其离散解为:x x x y y y y y y s e s e i i i ∆--+=∆+=+1或: y y y x x x x x x s e s e i i i ∆--+=∆+=+1这里 (x i , y i ) 是直线上一点的坐标值。

式(3.2.1)和(3.2.2)表示所求直线 y 值和 x 值关于相应增量的逐次递归关系,递归初值为直线的起点。

DDA (Digital Differential Analyzer) 算法即数字微分分析算法就是基于式(3.2.1)或(3.2.2)对直线进行光栅化的算法。

在一个坐标轴上以单位间隔对直线采样,以决定另一个坐标轴上最靠近直线的对应整数值。

(1)当直线斜率 0 ≤ m ≤ 1 时,则按单位 x 间隔(D x = 1)取样并计算每个连续的 y 值:m y y i i +=+1(2)当 -1≤ m ≤ 0 时,则仍按单位 x 间隔(D x =-1)取样并计算每个连续的 y 值:m y y i i -=+1(3)当 m >1 时,则将 x 和 y 交换,这就是说,按单位 y 间隔(D y = 1) 取样并计算每个连续的 x 值:11-++=m x x i i(4)当 m <- 1 时,则同样交换 x 和 y 交换,并按 D y =- 1间隔取样计算每个连续的 x 值:11-+-=m x x i i应用上面的算式,解可以设计斜率为任意值的直线。

二:程序代码:#include<stdio.h>#include<graphics.h>#include<math.h>void lineDDA(int xs,int ys,int xe,int ye,int c){int i;float x=xs,y=ys;float xIncrement ,yIncrement,steps,dx=xe-xs,dy=ye-ys; steps=abs(dx);if(abs(dy)>abs(dx))steps=abs(dy);xIncrement=dx/steps;yIncrement=dy/steps;putpixel(x,y,c);for(i=1;i<=steps;i++){x+=xIncrement;y+=yIncrement;putpixel(x,y,c);}}main(){int gdriver=DETECT;int gmode;initgraph(&gdriver,&gmode,""); setbkcolor(MAGENTA); lineDDA(10,14,20,50,1); getch();closegraph();}三:程序截图如下:四:试验心得体会:(1)DDA算法生成直线是非常快的,但是有一点需要注意的,就是x,y的数值类型。

计算机图形学实习报告

计算机图形学实习报告

实习报告实习名称:计算机图形学实习班级:学号:姓名:实习地点:实习指导教师:实习时间:年月日至月日一、实习目的与意义本次计算机图形学的实习分两部分,一部分是利用AutoCAD进行二维和三维模型的制作,另一部分是利用VC6.0进行编程实现对图形的简单操作。

通过对AutoCAD的实习,熟悉该软件的基本功能及操作特点,掌握二维及三维图形的基本制作过程。

通过对VC6.0的编程实习,理解图形的生成、图形的变换、图形的显示以及二维裁剪的基本思想,熟练掌握计算机图形学的基本原理和方法;熟练掌握计算机图形学算法的实现算法;学习和掌握图形系统的设计;学习用VC++编写计算机图形学程序;建立面向对象编程的基本概念。

二、实习主要内容1、AutoCAD软件操作(1)简单图形绘制(2)图形的基本编辑命令操作(3)标注文字及填充(4)三维图形绘制2.基于VC6.0下的计算机图形学程序编写(1)图形的生成:画直线、画圆、画曲线、画字符(2)图形的变换:平移、旋转、缩放、对称变换(3)图形的显示:扫描线填充、边缘填充、种子填充(4)图形的二维裁剪:CS裁剪、多边形裁剪、梁友栋裁剪、圆裁剪、中点分割法三、实习的主要过程第一部分 AutoCAD软件操作AutoCAD软件可以处理很多问题,在机械制图,土木建筑等方面有着广泛的应用,我们在机房打开AutoCAD软件对其进行系统配置,然后进行具体操作。

通过配置可以实现工具栏之类的快捷运用。

(1)简单图形绘制实习开始的第一天,在老师的讲解以及演示下,我们了解了AutoCAD软件的基本使用方法,与此同时,我们跟着老师的操作也逐渐熟悉了该软件的一些基本操作方法。

从设置基本绘图环境开始,按照指导书上的指示,采用边完成简单图形边学习各种命令的方式,逐渐熟练掌握了AutoCAD的使用,熟练掌握了其基本绘图功能,如掌握了绘图命令POINT、LINE、CIRCLE、ARC、DONUT、RECTANGLE、POLYLINE的功能及操作;掌握了实体绘图命令键盘输入的方法;掌握了缩放命令(ZOOM)的使用方法等。

计算机图形学报告

计算机图形学报告

计算机图形学总结报告学院:计算机与通信工程学院班级:计算机12-01学号:姓名:指导教师:计算机图形学总结报告一:课程总结通过一个学期的学习,了解了什么是计算机图形学、什么是图形API、为什么需要计算机图形学以及计算机图形学在各个领域的应用。

在学习过程中我们也通过实验课真正的了解和尝试的制作某些比较简单的图形学案例,比如一些基本的画笔与画刷、用鼠标交互式画图的算法、菜单编辑、一些基本的图形算法等等,其中我还以金刚石图案算法作为了我的特色程序设计。

计算机图形学是一种使用数学算法将二维或三维图形转化为计算机显示器的栅格形式的科学,研究的是应用计算机产生图像的所有工作,不管图像是静态的还是动态的,可交互的还是固定的,等等。

图形API是允许程序员开发包含交互式计算机图形操作的应用而不需要关注图形操作细节或任务系统细节的工具集。

计算机图形学有着广泛的应用领域,包括物理、航天、电影、电视、游戏、艺术、广告、通信、天气预报等几乎所有领域都用到了计算机图形学的知识,这些领域通过计算机图形学将几何模型生成图像,将问题可视化从而为各领域更好的服务。

计算机图形学利用计算机产生让人赏心悦目的视觉效果,必须建立描述图形的几何模型还有光照模型,再加上视角、颜色、纹理等属性,再经过模型变换、视图变换、投影操作等,通过这些步骤从而实现一个完整的OpenGL程序效果。

OpenGL是一个开放的三维图形软件包,它独立于窗口系统和操作系统,以它为基础开发的应用程序可以十分方便地在各种平台间移植。

计算机图形学通过应用OpenGL的功能,使得生成的图形效果具有高度真实感。

学习计算机图形学的重点是掌握OpenGL在图形学程序中的使用方法。

21世纪是信息的时代,在日新月异的科技更新中相信计算机会发挥越来越重要的作用,计算机图形学也会在更多的领域所应用,虽然我国在这方面还比较薄弱,但相信会有越来越好的时候的。

二:特色程序设计——金刚石图案算法(一):知识要点●在Visual C++ 6.0环境下创建MFC AppWizard(exe)。

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

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

计算机图形学上机报告上机项目:计算机图形学系别:班级:学号:姓名:上机报告上机项目计算机图形学上机日期指导教师实验地点一、上机目的熟练掌握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报告【范本模板】

江苏大学-计算机图形学实验1报告【范本模板】

实验报告的内容提纲实验报告应包括以下内容:(1)实验题目(2)实验内容(3)实验环境:本次上机实验所使用的平台和相关软件。

(4)问题分析:对所要解决的问题进行阐述和分析,提出解决方法,列出解决步骤。

(5)算法设计:用流程图或伪代码描述解决问题的算法。

(6)源代码(7)程序运行结果(8)总结1实验报告的格式规范(1)报告按以下内容次序编排:封面、成绩评定表、报告。

(2)用A4纸,通栏排版,页边距:上2。

2厘米,下2厘米,左2.7厘米,右2.3厘米;(3)行距一律用1.5倍行距;(4)中文一律用宋体,英文和数字一律用Times New Roman;(5)一级标题用四号粗体,段前段后不空行,二级标题用小四号粗体,左端不缩进,段前段后均不留多余空格;(6)正文用小四号,每段文字首行缩进2个字符.(7)关于正文中的“图”和“表”:➢图形下方标示图号与图名(见下面示例),图号与图名字体要求:中文宋体小五号,数字和英文Times New Roman,小五号;图1 学员报名信息管理模块➢表格上方标示表号与表名(见下面示例),表号与表名字体要求:中文宋体小五号, 数字和英文Times New Roman,小五号。

表1 科目表(tb_Subject)计算机科学与通信工程学院实验报告课程计算机图形学实验题目二维图形绘制学生姓名学号专业班级指导教师日期成绩评定表1. 实验内容绘制金刚石图案。

金刚石图案的成图规则是:把一个圆周等分成n份,然后每两点之间连线.当n取奇数时,该图案可一笔连续绘成,即用MoveTo函数确定一个当前点,然后连续用LineTo函数连点成线。

绘制下图所示的魔术三角形图案,采用三种可明显区分的颜色填充.绘制递归圆应用递归的方法绘制如下所示的图案2。

实验环境操作系统:Windows xp编译环境:Vc++6。

03. 问题分析1。

金刚石绘制本实验的核心是在圆的基础上绘制金刚石图案。

金刚石图案是一个二维图案,仅使用二维坐标(x,y)就可以绘制,本实验使用数组实现。

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

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

实验报告模板《计算机图形学》实验报告一、实验目的及要求1.实习三维图形的坐标系之间的变换;2.三维图形几何变换;3.掌握三维图形的坐标系之间的变换算法及三维图形几何变换的原理和实现;4.实现二维图形的基本变换(平移、旋转、缩放、错切、对称、复合等);5.实现三维图形的基本变换(平移、旋转、缩放、复合等);二、理论基础在齐次坐标理论下,二维图形几何变换矩阵可用下式表示:⎪⎪⎪⎭⎫⎝⎛===ifchebgdaTnkxx kk2,1,0,)(ϕ平移变换:[x* y* 1] =[x y 1] *0000001ts⎛⎫⎪⎪⎪⎝⎭=[t*x s*y 1]比例变换:[x* y* 1]=[x y 1] *1000101m n⎛⎫⎪⎪⎪⎝⎭=[m+x n+y 1]旋转变换:在平面上的二维图形饶原点逆时针旋转Ө角,变换矩阵为[x* y* 1]=[x y 1] *cos sin0sin cos0001θθθθ⎛⎫⎪- ⎪⎪⎝⎭= [x*cosө-y*sinө]复合变换:以上各种变换矩阵都是以原点为参照点,当以任意参照点进行变换的时候,我们就要用到复合变换矩阵。

三维变换类似于二维,在画图时,把三维坐标转换为二维即可。

三、算法设计与分析二维变换:#define dx 50#define dy 100void CCGWithVCView::OnTransScale() //平移(50,100){// TODO: Add your command handler code here// AfxMessageBox(_T("Please Insert The Move Change Code!")) ;int m[4][2]={{100,50},{50,100},{150,100},{100,50}};int i;int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<3;i++){a[0]=m[i][0];a[1]=m[i][1];b[0]=m[i+1][0];b[1]=m[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for(i=0;i<3;i++){a[0]=m[i][0]+dx;a[1]=m[i][1]+dy;b[0]=m[i+1][0]+dx;b[1]=m[i+1][1]+dy;DDALine(a,b, RGB(0, 200, 255), pDC);}}#define h 0.1745#include<math.h>void CCGWithVCView::OnTransRotate() //旋转{// TODO: Add your command handler code here// AfxMessageBox(_T("Please Insert The Rotate Change Code!")) ;int m[4][2]={{100,50},{50,100},{150,100},{100,50}};int i;int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<3;i++){a[0]=m[i][0];a[1]=m[i][1];b[0]=m[i+1][0];b[1]=m[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for(i=0;i<3;i++){a[0]=m[i][0]*cos(h)-m[i][1]*sin(h);a[1]=m[i][1]*cos(h)+m[i][0]*sin(h);b[0]=m[i+1][0]*cos(h)-m[i+1][1]*sin(h);b[1]=m[i+1][1]*cos(h)+m[i+1][0]*sin(h);DDALine(a,b, RGB(0, 200, 255), pDC);}}#define k 2;#define f 2.5void CCGWithVCView::OnTransMove() //缩放{// TODO: Add your command handler code here//AfxMessageBox(_T("Please Insert The Scale Change Code!")) ;int m[4][2]={{100,50},{50,100},{150,100},{100,50}};int i;int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<3;i++){a[0]=m[i][0];a[1]=m[i][1];b[0]=m[i+1][0];b[1]=m[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for(i=0;i<3;i++){a[0]=m[i][0]*k;a[1]=m[i][1]*f;b[0]=m[i+1][0]*k;b[1]=m[i+1][1]*f;DDALine(a,b, RGB(0, 200, 255), pDC);}}#define n 2#define d 0void CCGWithVCView::OnTransOther(){// TODO: Add your command handler code here//AfxMessageBox(_T("Please Insert The Other Change Code!")) ;int m[4][2]={{100,50},{50,100},{150,100},{100,50}};int i;int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<3;i++){a[0]=m[i][0];a[1]=m[i][1];b[0]=m[i+1][0];b[1]=m[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for(i=0;i<3;i++){a[0]=m[i][0]+n*m[i][1];a[1]=m[i][1]+d*m[i][0];b[0]=m[i+1][0]+n*m[i+1][1];b[1]=m[i+1][1]+d*m[i+1][0];DDALine(a,b, RGB(0, 200, 255), pDC);}}三维变换:#include<math.h>#define dx 100#define dy 100#define dz 0void CCGWithVCView::OnTransScale() //平移(50,100){// TODO: Add your command handler code here// AfxMessageBox(_T("Please Insert The Move Change Code!")) ;int i;int p2d[6][2];int p3d[6][3]={{400,300,0},{300,400,0},{300,300,10},{275,300,0},{400,300,0},{300,300,10}};for( i=0;i<6;i++){p2d[i][0]=p3d[i][1]-p3d[i][0]/sqrt(2);p2d[i][1]=p3d[i][2]+p3d[i][0]/sqrt(2);}int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<5;i++){a[0]=p2d[i][0];a[1]=p2d[i][1];b[0]=p2d[i+1][0];b[1]=p2d[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for( i=0;i<6;i++){p2d[i][0]=p3d[i][1]+dy-p3d[i][0]+dx/sqrt(2);p2d[i][1]=p3d[i][2]+dz+p3d[i][0]+dx/sqrt(2);}for(i=0;i<5;i++){a[0]=p2d[i][0];a[1]=p2d[i][1];b[0]=p2d[i+1][0];b[1]=p2d[i+1][1];DDALine(a,b, RGB(0, 0, 255), pDC);}}#define k 0.1745void CCGWithVCView::OnTransRotate() //旋转{// TODO: Add your command handler code here// AfxMessageBox(_T("Please Insert The Rotate Change Code!")) ;int i;int p2d[6][2];int p3d[6][3]={{400,300,0},{300,400,0},{300,300,10},{275,300,0},{400,300,0},{300,300,10}};for( i=0;i<6;i++){p2d[i][0]=p3d[i][1]-p3d[i][0]/sqrt(2);p2d[i][1]=p3d[i][2]+p3d[i][0]/sqrt(2);}int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<5;i++){a[0]=p2d[i][0];a[1]=p2d[i][1];b[0]=p2d[i+1][0];b[1]=p2d[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for( i=0;i<6;i++){p2d[i][0]=p3d[i][1]*cos(k)-p3d[i][2]*sin(k)-p3d[i][0]/sqrt(2);p2d[i][1]=p3d[i][2]*cos(k)+p3d[i][1]*sin(k)+p3d[i][0]/sqrt(2);}for(i=0;i<5;i++){a[0]=p2d[i][0];a[1]=p2d[i][1];b[0]=p2d[i+1][0];b[1]=p2d[i+1][1];DDALine(a,b, RGB(0, 0, 255), pDC);}}四、程序调试及结果的分析二维:三维:五、实验心得及建议在实验过程中,尽管过程中任由许多不会的地方,而且有待于今后的提高和改进,但我加深了对书本上知识的理解与掌握,同时也学到了很多书本上没有东西,并积累了一些宝贵的经验,这对我以后的学习与工作是不无裨益的。

计算机图形学上机报告

计算机图形学上机报告

计算机图形学上机实验报告计算机科学与技术学院班级:学号:姓名:指导教师:完成日期:实验一:基本图元绘制一. 实验目的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. 了解如何利⽤OpenGL库绘制图形2. 理解glut程序框架3. 理解窗⼝到视区的变换4. 理解OpenGL实现动画的原理⼆. 实验内容1. 实现中点Bresenham算法画直线2. 实现改进Bresenham算法画直线3. 实现圆的绘制三. 实验结果1.DDA算法画直线2. 中点Bresenham算法画直线3. 改进Bresenham算法画直线4. Bresenham算法画圆四. 源程序#include#include#include "stdio.h"int m_PointNumber = 0; //动画时绘制点的数⽬int m_DrawMode = 4; //绘制模式 1 DDA算法画直线// 2 中点Bresenham算法画直线// 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;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;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++;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 (xputpixel(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) {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. 通过变换调整观察的位置与⽅向三. 实验结果太阳、地球和⽉亮的运动模型图1.图2.图3.四. 源程序#include#include#include#includevoid 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); */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);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;}。

计算机图形学报告

计算机图形学报告
pDC->SetPixel(-r, -x,c);
}
void CDdaView::OnMidPiontline()
{
// TODO: Add your command handler code here
CDC* pDC=GetDC();//获得设备指针
int xa=100 ,ya=30 ,xb=500 ,yb=600 ,c=RGB(255,0,0);
}
void CDdaView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CDdaDoc* CDdaView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDdaDoc)));
}
ReleaseDC(pDC);
}
五、实验结果:
六、总结:
}
ReleaseDC(pDC);
}
中点画圆算法:
void CMyView::OnMidpointCircle()
{
CDC *pDC=GetDC();
int xc= ,yc= ,r = ,c=0;
int x,y;
float d;
x=0,y=r,d=1.25-r;
描点(x,y)以及其他七个对称点;
while(x<=y)
{
pDC->SetPixel(x, r,c);
pDC->SetPixel(x, -r,c);
pDC->SetPixel(-x, r,c);
pDC->SetPixel(-x, -r,c);

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

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

计算机图形学上机实验报告实验名称:线画图元生成中国石油大学(北京)信息学院计算机科学与技术系班级:计算机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)画刷为圆形四、实验讨论与体会体会:通过本次实验,让我了解到了上文提到的几种算法实现的具体过程,并且通过动态画线,对几种算法生成线的过程和特点也有个更进一步的学习和掌握。

工作报告之计算机图形学实验报告

工作报告之计算机图形学实验报告

工作报告之计算机图形学实验报告计算机图形学实验报告【篇一:计算机图形学实验报告及代码】第1 章概述一、教学目标通过本章的学习,使学生能够了解计算机图形学的基本概念、研究内容;当前的发展概况;本门课程的特点和应用。

二、教学要求1. 了解计算机图形学的概念和研究内容;2. 了解本门课程的发展概况。

三、教学内容提要1. 计算机图形学的研究内容2. 计算机图形学发展概况3. 计算机图形学特点和应用4. 计算机图形学当前研究的课题5. 计算机图形生成和输出的流水线四、教学重点、难点及解决方法本章将主要围绕计算机图形学的基本概念进行介绍,介绍研究内容;当前的发展概况;本门课程的特点和应用等等。

五、课时安排2学时六、教学设备多媒体七、检测教学目标实现程度的具体措施和要求通过课堂提问的方式来检测学生对基本概念的掌握程度。

八、教学内容1.1 计算机图形学的研究内容计算机图形学(computer graphics): 研究通过计算机将数据转换为图形,并在专用显示设备上显示的原理、方法和技术的学科。

计算机图形表现形式(1).线条式(线框架图)用线段来表现图形,容易反映客观实体的内部结构,如各类工程技术中结构图的表示,机械设计中零件结构图及电路设计中的电路原理图等。

具有面模型、色彩、浓淡和明暗层次效应,适合表现客观实体的外形或外貌,如汽车、飞机、轮船等的外形设计以及各种艺术品造型设计等。

(2).真实感面模型图形跑车靓照计算机图形分类(空间)(1).二维图形(2d):在平面坐标系中定义的图形(2).三维图形(3d):在三维坐标系中定义的图形计算机图形产生方法(1).矢量法(短折线法)任何形状的曲线都用许多首尾相连的短直线(矢量)逼近。

(2).描点法(像素点串接法)每一曲线都是由一定大小的像素点组成计算机绘图方式:(1)交互式绘图允许操作者以某种方式(对话方式或命令方式)来控制和操纵图形生成过程,使得图形可以边生成、边显示、边修改,直至符合要求为止。

图形学上机实验报告

图形学上机实验报告

计算机图形学上机实验报告计算机科学与技术学院班级: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中的深度测试缓存器算法。

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

实验报告(第9周)
班级:姓名:学号:
实验名称:实现边缘填充算法和区域填充算法
报告内容:
1、任务描述
(1)生成一个MFC单文档应用程序,添加必要的菜单和功能
(2)仿照上个实验,使用画线函数绘制一个线框多边形
(3)完成边缘填充算法的程序,实现多边形填充
(4)多边形一个顶点为圆心绘制一个圆,与多边形交集形成一块自定义区
域;使用边界定义的四连通种子填充算法,填充这个区域
2、试验环境
(1)Visual Studio 6.0 (或以上)标准版
3、试验目标
(1)掌握边缘填充算法
(2)掌握区域的种子填充算法
4、实验步骤
(运行结果抓图,有用的程序代码,并辅助文字说明)。

相关文档
最新文档