




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、武汉理工大学计算机图形学基础课程论文武汉理工大学课程论文课 程 名 称 计算机图形学基础 开 课 学 院 计算机科学与技术学院 指导老师姓名 岑 丽 学 生 姓 名 朱驰风 学 生 学 号 学生专业班级 软件0801班 2010 2011学年 第 2学期目 录一.课设论文21课设要求22程序的简单操作及功能说明23系统各模块说明74源程序及相应说明75遇到的问题及解决办法216.参考文献22二课程论文23三.评分表26四.封底27课设论文一 课设要求图形学基础图形处理系统实现:本系统需要实现以下内容:1给出系统框架。2调用画点的函数,分别用dda、中点bresenham算法和改进bresenh
2、am算法绘制直线和中点算法绘制直线、用不同的算法绘制圆和椭圆 ,并各自比较算法精度与效率的差别 。3实现二维图形的变换。(包括平移,放缩,旋转,错切以及复合变换)4运用所学的多边形扫描算法实现多边形的扫描转换。5运用所学的区域填充算法实现区域填充。6运用所学算法实现线段裁剪以及多边形裁剪(多边形裁剪为可选)。7自己实现其它附加以及需要完善的功能模块。二 程序的简单操作及功能说明1操作界面2初始化、设置坐标轴最大正坐标以及清屏功能3.颜色设置通过拖动滚动条可以自行调色,并显示当前颜色4.画图功能程序可以实现用dda、中点bresenham算法和改进bresenham算法绘制直线,绘制圆、椭圆以及
3、多边形。其中绘制直线可以通过输入端点坐标或直接用鼠标拖动来实现,绘制多边形时需要先确定多边形顶点,然后再进行连接。 5.区域填充程序可以实现圆,椭圆和多边形的填充功能,其中圆和椭圆需要输入圆心,半径,长短半轴的值,多边形仍需先画点后填充。最后多边形的填充有一点小bug,图形右方和下方会多出一到两条线条,至今没调试好。三系统各模块说明系统分为设置坐标轴属性模块,显示坐标轴属性模块,画图模块,填充模块,颜色模块。四源程序及相应说明1.主窗口dim linex(1000) as double, liney(1000) as double, n as integer, m as integer, mo
4、usedrow as integerpublic cr as integer, cg as integer, cb as integer private sub inputline_click()form2.showend subprivate sub circle_click()form3.showend subprivate sub ellipse_click()form4.showend subprivate sub circlefull_click()form5.showend subprivate sub ellipsefull_click()form6.showend subpri
5、vate sub about_click()form7.showend subprivate sub exit_click()endend subprivate sub mouseline_click()mousedrow = 2n = 0end subprivate sub polygonstart_click()mousedrow = 1n = 0end subprivate sub polygonend_click()for m = 1 to n - 1dim dx, dy, epsl, k, xe as double, ye as double, xincre as double, y
6、incre as doubledx = linex(m) - linex(m - 1)dy = liney(m) - liney(m - 1)xe = linex(m - 1)ye = liney(m - 1)if (abs(dx) abs(dy) then epsl = abs(dx) else: epsl = abs(dy)xincre = dx / epslyincre = dy / epslfor k = 0 to epslpicture1.pset (clng(xe), clng(ye), rgb(hscroll1(0).value, hscroll1(1).value, hscro
7、ll1(2).value)xe = xe + xincreye = ye + yincrenext knext mdx = linex(n - 1) - linex(0)dy = liney(n - 1) - liney(0)xe = linex(0)ye = liney(0)if (abs(dx) abs(dy) then epsl = abs(dx) else: epsl = abs(dy)xincre = dx / epslyincre = dy / epslfor k = 0 to epslpicture1.pset (clng(xe), clng(ye), rgb(hscroll1(
8、0).value, hscroll1(1).value, hscroll1(2).value)xe = xe + xincreye = ye + yincrenext kmousedrow = 0end subprivate sub polygonfullstart_click()mousedrow = 1n = 0end subprivate sub polygonfullend_click()mousedrow = 11 求最大最小y值dim miny as double, maxy as double, i as integer, k as integer, j as doublei =
9、 0k = 0miny = liney(0)maxy = liney(0)for m = 1 to ndo while (liney(m) maxy)maxy = liney(m)loopnext m2 从y=miny到y=maxy扫描-1求交dim x as double, y as doubledim xo as double, x1 as double, x2 as double, yo as double, y1 as double, y2 as doubledim jx(1000) as doublefor y = miny to maxyfor k = 0 to n - 2x1 =
10、 linex(k)x2 = linex(k + 1)y1 = liney(k)y2 = liney(k + 1)if (x1 x2) thenx0 = x1x1 = x2x2 = x0y0 = y1y1 = y2y2 = y0end if 保证x1= x1 and x x2) thenx0 = x1x1 = x2x2 = x0y0 = y1y1 = y2y2 = y0end if 保证x1= x1 and x jx(m + 1) thenj = jx(m)jx(m) = jx(m + 1)jx(m + 1) = jend ifnext mnext k-3填充for k = 0 to nfor
11、x = jx(k) to jx(k + 1)picture1.pset (x, y), rgb(hscroll1(0).value, hscroll1(1).value, hscroll1(2).value)next xk = k + 1next ki = 0next ymousedrow = 0end subprivate sub form_load()picture1.clsmousedrow = 0picture1.scale (-1000, 1000)-(1000, -1000)picture1.line (-1000, 0)-(1000, 0)picture1.line (0, -1
12、000)-(0, 1000)label4.caption = 1000end subprivate sub reset_click()picture1.clsmousedrow = 0picture1.scale (-1000, 1000)-(1000, -1000)picture1.line (-1000, 0)-(1000, 0)picture1.line (0, -1000)-(0, 1000)label4.caption = 1000end subprivate sub setmax_click()dim message, title, default, maxxmessage = 请
13、输入坐标轴最大正坐标titlt = 输入选择default = 1000maxx = inputbox(message, title, default)picture1.clsmousedrow = 0picture1.scale (-maxx, maxx)-(maxx, -maxx)picture1.line (-maxx, 0)-(maxx, 0)picture1.line (0, -maxx)-(0, maxx)label4.caption = maxxend subprivate sub clean_click()picture1.clsmousedrow = 0dim aa = la
14、bel4.captionpicture1.scale (-a, a)-(a, -a)picture1.line (-a, 0)-(a, 0)picture1.line (0, -a)-(0, a)end subprivate sub picture1_mousemove(button as integer, shift as integer, x as single, y as single)label6.caption = ( & clng(x) & , & clng(y) & )end subprivate sub picture1_mousedown(button as integer,
15、 shift as integer, x as single, y as single)linex(n) = xliney(n) = yn = n + 1if mousedrow = 1 thenpicture1.pset (x, y), rgb(hscroll1(0).value, hscroll1(1).value, hscroll1(2).value)end ifend subprivate sub picture1_mouseup(button as integer, shift as integer, x as single, y as single)linex(n) = xline
16、y(n) = yif mousedrow = 2 thendim dx, dy, epsl, k, xe as double, ye as double, xincre as double, yincre as doubledx = linex(n) - linex(n - 1)dy = liney(n) - liney(n - 1)xe = linex(n - 1)ye = liney(n - 1)if (abs(dx) abs(dy) then epsl = abs(dx) else: epsl = abs(dy)xincre = dx / epslyincre = dy / epslfo
17、r k = 0 to epslpicture1.pset (clng(xe), clng(ye), rgb(hscroll1(0).value, hscroll1(1).value, hscroll1(2).value)xe = xe + xincreye = ye + yincrenext kn = n + 1end ifend subprivate sub hscroll1_change(index as integer)labelrgb(index).caption = hscroll1(index).valuelabel7.backcolor = rgb(hscroll1(0).val
18、ue, hscroll1(1).value, hscroll1(2).value)cr = hscroll1(0).valuecg = hscroll1(1).valuecb = hscroll1(2).valueend subprivate sub hscroll1_scroll(index as integer)hscroll1_change (index)end sub说明:1. 在通用中定义了3个公共变量cr、cg、cb,分别对应rgb函数中的3个值,用来控制颜色属性。数组linex(1000),liney(1000)分别用来存放直线两端点或多边形顶点的x,y轴坐标。2. privat
19、e sub form_load(),private sub reset_click(),private sub setmax_click()和private sub clean_click()实现坐标轴的初始化、设置、清屏功能。3. private sub picture1_mousemove实现获取鼠标当前坐标的功能。4. private sub picture1_mousedown和private sub picture1_mouseup的功能:当mousedrow=1时,完成绘制多边形顶点,并将顶点坐标分别存入数组数组linex(1000),liney(1000)中;当mousedrow
20、=2时,只完成鼠标拖动画直线的功能。5. private sub hscroll1_change(index as integer)和private sub hscroll1_scroll(index as integer)实现了调节颜色的功能。6. private sub polygonstart_click()和private sub polygonend_click()实现绘制多边形的功能7. private sub polygonfullstart_click()和private sub polygonfullstart_click()实现多边形填充的功能2.直线private sub
21、 command1_click()dim x0 as double, x1 as double, y0 as double, y1 as doublex0 = text1.texty0 = text2.textx1 = text3.texty1 = text4.textdim dx, dy, epsl, k, x as double, y as double, xincre as double, yincre as doubledx = x1 - x0dy = y1 - y0x = x0y = y0if (abs(dx) abs(dy) then epsl = abs(dx) else: ep
22、sl = abs(dy)xincre = dx / epslyincre = dy / epslfor k = 0 to epslform1.picture1.pset (clng(x), clng(y), rgb(form1.cr, form1.cg, form1.cb)x = x + xincrey = y + yincreform2.hidenext kend subprivate sub command2_click()dim x0 as double, x1 as double, y0 as double, y1 as doublex0 = text1.texty0 = text2.
23、textx1 = text3.texty1 = text4.textdim dx, dy, d, upincre, downincre, x as double, y as double, k as doubleif (x0 x1) thenx = x1x1 = x0x0 = xy = y1y1 = y0y0 = yend if 保证x1x0x = x0y = y0dx = x1 - x0dy = y1 - y0k = (y1 - y0) / (x1 - x0)if (k 1) thend = 2 * dx - dyupincre = 2 * dxdownincre = 2 * dx - 2
24、* dydo while (x = x1)form1.picture1.pset (x, y), rgb(form1.cr, form1.cg, form1.cb)y = y + 1if (d = 0 and k = 1) thend = dx - 2 * dyupincre = 2 * dx - 2 * dydownincre = -2 * dydo while (x = x1)form1.picture1.pset (x, y), rgb(form1.cr, form1.cg, form1.cb)x = x + 1if (d 0) theny = y + 1d = d + upincree
25、lse: d = d + downincreend ifloopelseif (k = -1) thend = -dx - 2 * dyupincre = -2 * dydownincre = -2 * dx - 2 * dydo while (x = x1)form1.picture1.pset (x, y), rgb(form1.cr, form1.cg, form1.cb)x = x + 1if (d 0) thend = d + upincreelse: y = y - 1d = d + downincreend ifloopelseif (k = -1) thend = -2 * d
26、x - dyupincre = -2 * dx - 2 * dydownincre = -2 * dxdo while (x = x1)form1.picture1.pset (x, y), rgb(form1.cr, form1.cg, form1.cb)y = y - 1if (d x1) thenx = x1x1 = x0x0 = xy = y1y1 = y0y0 = yend if 保证x1x0dx = x1 - x0dy = y1 - y0e = -dxx = x0y = y0do while (x 0) theny = y + 1e = e - 2 * dxend ifloopfo
27、rm2.hideend sub说明:1.3个command分别实现3种算法画直线。2.中点bresenham算法需要分四种情况进行讨论:直线斜率k-1 ,-1=k0,0=k1。3.改进的中点bresenham算法只能画出斜率为0k1的直线。3圆private sub command1_click()dim r as double, circlex as double, circley as doublecirclex = text1.textcircley = text2.textr = text3.textdim x as integer, y as integer, d as intege
28、rx = 0y = rd = 1 - rdo while (x = y)form1.picture1.pset (x + circlex, y + circley), rgb(form1.cr, form1.cg, form1.cb)form1.picture1.pset (y + circlex, x + circley), rgb(form1.cr, form1.cg, form1.cb)form1.picture1.pset (-y + circlex, x + circley), rgb(form1.cr, form1.cg, form1.cb)form1.picture1.pset
29、(-x + circlex, y + circley), rgb(form1.cr, form1.cg, form1.cb)form1.picture1.pset (-x + circlex, -y + circley), rgb(form1.cr, form1.cg, form1.cb)form1.picture1.pset (-y + circlex, -x + circley), rgb(form1.cr, form1.cg, form1.cb)form1.picture1.pset (y + circlex, -x + circley), rgb(form1.cr, form1.cg,
30、 form1.cb)form1.picture1.pset (x + circlex, -y + circley), rgb(form1.cr, form1.cg, form1.cb)if (d 0) thend = d + 2 * x + 3elsed = d + 2 * (x - y) + 5y = y - 1end ifx = x + 1loopform3.hideend subprivate sub command2_click()form3.hideend sub4椭圆private sub command1_click()dim circlex as double, circley
31、 as doublecirclex = text1.textcircley = text2.texta = text3.textb = text4.textdim x as integer, y as integerdim d1 as double, d2 as doublex = 0y = bd1 = b * b + a * a * (-b + 0.25)form1.picture1.pset (x + circlex, y + circley), rgb(form1.cr, form1.cg, form1.cb)form1.picture1.pset (-x + circlex, -y +
32、 circley), rgb(form1.cr, form1.cg, form1.cb)form1.picture1.pset (-x + circlex, y + circley), rgb(form1.cr, form1.cg, form1.cb)form1.picture1.pset (x + circlex, -y + circley), rgb(form1.cr, form1.cg, form1.cb)do while (b * b * (x + 1) a * a * (y - 0.5)if (d1 0)if (d2 = 0) thend2 = d2 + b * b * (2 * x
33、 + 2) + a * a * (-2 * y + 3)x = x + 1y = y - 1elsed2 = d2 + a * a * (-2 * y + 3)y = y - 1end ifform1.picture1.pset (x + circlex, y + circley), rgb(form1.cr, form1.cg, form1.cb)form1.picture1.pset (-x + circlex, -y + circley), rgb(form1.cr, form1.cg, form1.cb)form1.picture1.pset (-x + circlex, y + ci
34、rcley), rgb(form1.cr, form1.cg, form1.cb)form1.picture1.pset (x + circlex, -y + circley), rgb(form1.cr, form1.cg, form1.cb)loopform4.hideend subprivate sub command2_click()form4.hideend sub5.圆填充private sub command1_click()dim r as double, circlex as double, circley as doublecirclex = text1.textcircl
35、ey = text2.textr = text3.textdim x as integer, y as integer, d as integerx = 0y = rd = 1 - rdo while (x = y)form1.picture1.pset (x + circlex, y + circley), rgb(form1.cr, form1.cg, form1.cb)form1.picture1.pset (y + circlex, x + circley), rgb(form1.cr, form1.cg, form1.cb)form1.picture1.pset (-y + circ
36、lex, x + circley), rgb(form1.cr, form1.cg, form1.cb)form1.picture1.pset (-x + circlex, y + circley), rgb(form1.cr, form1.cg, form1.cb)form1.picture1.pset (-x + circlex, -y + circley), rgb(form1.cr, form1.cg, form1.cb)form1.picture1.pset (-y + circlex, -x + circley), rgb(form1.cr, form1.cg, form1.cb)
37、form1.picture1.pset (y + circlex, -x + circley), rgb(form1.cr, form1.cg, form1.cb)form1.picture1.pset (x + circlex, -y + circley), rgb(form1.cr, form1.cg, form1.cb)if (d 0) thend = d + 2 * x + 3elsed = d + 2 * (x - y) + 5y = y - 1end ifx = x + 1loopform5.hidedim maxy as integer, miny as integer, xl
38、as integer, xr as integer, emaxy = clng(circley + r)miny = clng(circley - r)for y = miny to maxye = sqr(r * r - (y - circley) * (y - circley)xl = clng(circlex - e)xr = clng(circlex + e)for x = xl to xrform1.picture1.pset (x, y), rgb(form1.cr, form1.cg, form1.cb)next xnext yend subprivate sub command
39、2_click()form5.hideend sub8. 椭圆填充private sub command1_click()dim circlex as double, circley as doublecirclex = text1.textcircley = text2.texta = text3.textb = text4.textdim x as integer, y as integerdim d1 as double, d2 as doublex = 0y = bd1 = b * b + a * a * (-b + 0.25)form1.picture1.pset (x + circ
40、lex, y + circley), rgb(form1.cr, form1.cg, form1.cb)form1.picture1.pset (-x + circlex, -y + circley), rgb(form1.cr, form1.cg, form1.cb)form1.picture1.pset (-x + circlex, y + circley), rgb(form1.cr, form1.cg, form1.cb)form1.picture1.pset (x + circlex, -y + circley), rgb(form1.cr, form1.cg, form1.cb)d
41、o while (b * b * (x + 1) a * a * (y - 0.5)if (d1 0)if (d2 = 0) thend2 = d2 + b * b * (2 * x + 2) + a * a * (-2 * y + 3)x = x + 1y = y - 1elsed2 = d2 + a * a * (-2 * y + 3)y = y - 1end ifform1.picture1.pset (x + circlex, y + circley), rgb(form1.cr, form1.cg, form1.cb)form1.picture1.pset (-x + circlex
42、, -y + circley), rgb(form1.cr, form1.cg, form1.cb)form1.picture1.pset (-x + circlex, y + circley), rgb(form1.cr, form1.cg, form1.cb)form1.picture1.pset (x + circlex, -y + circley), rgb(form1.cr, form1.cg, form1.cb)loopform6.hidedim maxy as integer, miny as integer, xl as integer, xr as integer, emax
43、y = clng(circley + b)miny = clng(circley - b)for y = miny to maxye = sqr(a * a - (y - circley) * (y - circley) * a * a / (b * b)xl = clng(circlex - e)xr = clng(circlex + e)for x = xl to xrform1.picture1.pset (x, y), rgb(form1.cr, form1.cg, form1.cb)next xnext yend subprivate sub command2_click()form
44、6.hideend sub五遇到的问题及解决办法1.坐标轴取值问题:一开始坐标轴的最大正坐标取的太小了,导致绘制的图形完全不能显示,调整之后就能显示了。2.数据类型定义问题:定义数据类型的时候,在若干变量之后只写了一个as ,导致无法绘制图形,在每个变量后面都加上as 之后问题就解决了。3.溢出问题:这个有两点。一个是数据类型没有定义,导致一些变量在计算的时候溢出,通过将这些变量设置成double类型之后,问题解决了。另一个是因为在写循环语句的时候,循环次数没有计算正确导致出现了溢出,改正之后就不溢出了。4.指针问题:由于vb没有指针,所以不能实现改进的扫描填充算法。5.交点问题:对于多边形填
45、充的算法,有个小bug,填充之后都会在图形右方和下方出现一到两条直线,我想是因为扫描线和多边形顶点的交点个数没有进行处理的原因。这个算法不会写,所以不知道如何改正。六参考文献1计算机图形学基础(第二版),陆枫 何云峰 编著,电子工业出版社2vb程序设计,胡彧 闫宏印 编著,电子工业出版社课程论文计算机图形学算法可视化研究与实践摘要:利用可视化编程工具vb60对基本图元的生成、多边形填充、直线段裁剪、曲线生成及分形算法进行可视化设计与实现,同时给出了实践过程中发现的问题及解决方法。关键字:算法可视化;计算机图形学正文:一、引言计算机图形学产生于20世纪60年代,主要研究如何在计算机中表示图形,以
46、及利用计算机进行图形的计算、处理和显示的相关原理与算法,其目的就是要利用计算机产生令人赏心悦目的真实感图形。经过半个多世纪的快速发展,其研究范围已涉及图形硬件、图形标准、图形交互技术、光栅图形生成算法、曲线曲面造型、实体造型、真实感图形计算与显示算法、非真实感绘制等具体领域,而近年来又在智能cad、计算机美术与设计、计算机动画艺术、科学计算可视化、虚拟现实等方向有了长足的进展,其研究成果被广泛应用于科学计算、计算机辅助设计和制造、三维动画、影视特效、游戏、互动媒体等领域。其分支方向科学计算可视化,是将科学计算过程中及计算结果的数据转换为几何图形及图像信息在屏幕上显示出来并进行交互处理,成为发现和理解科学计算过程中各种现象的有力工具,被广泛地应用于医疗诊断、地质勘探、气象数据处理、工程计算仿真等领域,成为目前图形学相关领域最热门的技术之一。二、计算机图形学算法可视化总体设计1确定可视化内容及目标(1)主要完成如下算法的可视化实现:基本图元(直线、圆弧、椭圆弧)生成,多边形填充,直线段裁剪,曲线生成及分形模拟。(2)界面设计的便捷性。在有限时间内,用户不应花费太多的时间去摸索复杂困难的界面,必须以用户操作方便为原则。(3)提供用户输入数据。用户可通过鼠标拾取或键盘输入的方式对变量或参数进行更改,可观察不同输入情况下程序的执行过程以便更好地理解算法的执行过程。同时也要注
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025版桥梁钢模板研发、制造及出口贸易合同
- 二零二五年版安防设备购销及系统集成合同
- 2025版酒店集团食堂蔬菜统一采购合作协议
- 二零二五年度房产赠与与装修工程配套合同
- 二零二五年度户外活动中心装修工程合同范本
- 2025版通信线路保护及修复施工合同
- 实验动物专业毕业论文
- 2025鲜花造型考试题及答案
- 2025共话教育考试题及答案
- 2025选聘人员考试题及答案
- 奶茶店饮品制作手册
- 初中化学课程标准(2022年版)考试题库(含答案)
- 人教版小学英语3-6年级单词(带音标)
- 部编人教版六年级上册语文全册教学课件+单元复习课件
- 酒店消防安全管理制度(2022版)
- 2024环氧磨石地坪施工技术规程
- 人教部编七年级语文全册专项知识点梳理归纳字词、文言文、古诗词
- 国家基本公共卫生服务规范第三版测试
- 2022年版初中物理课程标准解读-课件
- 人教版六年级上册数学全册教案教学设计含教学反思
- 输配电绝缘子维护与更换
评论
0/150
提交评论