实验二基本图形的生成技术解析.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
实验二基本图形的生成技术解析

实验二 基本图形的生成技术 A.直线生成算法 一、实验目的 在一个图形系统中,基本图形(也称为图元、图素等)的生成技术是最基本的,任何复杂的图形都是由基本图形组成的,基本图形生成的质量直接影响该图形系统绘图的质量。所以,需要设计出精确的基本图形生成算法,以确保图形系统绘图的精确性。本次实验的目的就是验证直线生成的三种扫描算法,并要求对基本算法进行扩充和改进,包括:利用Visual C++实现直线生成算法,验证算法的正确性; 二、基本知识和实验步骤 任务一:实现三种画线程序 DDA算法分析 假设 直线的起点坐标为P1 (x1,y1),终点坐标为P2 (x2,y2), x方向的增量为 △x=x2-x1 ;y方向上增量为 △y=y2-y1,直线的斜率为 k=△y/△x 当 △x>△y 时,让 x 从 x1 到 x2 变化,每步递增 1,那么,x 的变化可以表示为 xi+1=xi+1,y 的变化可以表示为 yi+1=yi+k 用上式可求得图中直线 P1P2 和 y 向 网格线的交点,但显示时要用舍入找到最 靠近交点处的象素点耒表示。当 △x△y 时, 让 y 递增 1,x作相应变化。 综合考虑,按照从(x1, y1)到(x2, y2)方向不同,分8个象限。对于方向在第1a象限内的直线而言,取增量值Dx=1,Dy=m。对于方向在第1b象限内的直线而言,取增量值Dy=1,Dx=1/m。 直线Bresenham算法分析 设直线从起点(x1, y1)到终点(x2, y2)。直线可表示为: 方程y=mx+b,其中 b=y1-m*x1,m=(y2-y1/(x2-x1)=dy/dx; 此处的讨论先将直线方向限于1a象限,在这种情况 下,当直线光栅化时,x每次都增加1个单元, 即xi+1 = xi + 1而y的相应增加值应当小于1。 为了光栅化,yi+1只可能选择右图中两种位置之一。 yi+1的位置选择yi+1 =yi或者yi+1=yi+1,选择的原则是看精确 值y与yi及yi+1的距离d1及d2的大小而定。计算公式为 y = m(xi + 1) + b (1) d1 = y ( yi (2) d2 = yi +1 - y (3) 如果d1(d20,则yi+1=yi+1,否则yi+1=yi。 将式(1)、(2)、(3)代入d1(d2,再用dx乘等式两边,并以Pi=(d1(d2) dx代入上述等式,得Pi = 2xidy(2yidx+2dy+(2b(1) dx (4) 其中,d1(d2是用以判断符号的误差。由于在1a象限,dx总大于0,所以Pi仍旧可以用作判断符号的误差。将(4)式中的i用i+1替换,于是Pi+1为 Pi+1 = Pi+2dy(2(yi+1(yi) dx 求误差的初值P1,可将x1、y1和b代入式(4)中的xi、yi而得到 P1 = 2dy(dx 综述上面的推导,第1a象限内的直线Bresenham算法思想如下: ⒈ 画点(x1, y1),dx=x2(x1,dy=y2(y1,计算误差初值P1=2dy( dx,i=1; ⒉ 求直线的下一点位置 xi+1 = xi + 1 如果Pi0,则yi+1=yi+1,否则yi+1=yi; ⒊ 画点(xi+1, yi+1); ⒋ 求下一个误差Pi+1,如果Pi0,则Pi+1=Pi+2dy(2dx,否则 Pi+1=Pi+2dy; ⒌ i=i+1;如果idx+1则转步骤2;否则结束操作。 实验步骤: 建立一个DDALine的工程文件; 添加ddaline()成员函数 方法:在工作区中选择CLASSVIEW类窗口,右击CDDAlineView类,选择“add member function…”,定义如下的成员函数: void ddaline(CDC* pDC,int x0,int y0,int x1,int y1,COLORREF color); 编写自定义的成员函数ddaline()程序 void CDDALineView::ddaline(CDC *pDC, int x0, int y0, int x1, int y1, COLORREF color) { int i; float length,x,y,dx,dy; length=abs(x1-x0); if (abs(y1-y0)length) length=float(abs(y1-y0)); dx=(float(x1-x0))/length; dy=(float(y1-y0))/length; x=

文档评论(0)

wbjsn + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档