- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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=
您可能关注的文档
最近下载
- 2025年安徽皖江高速公路有限公司高速公路收费人员招聘笔试模拟试题及答案解析.docx VIP
- 人体结构与功能教案仅供参考.pptx VIP
- 物探报告范例.pdf VIP
- 三级养老护理员国家职业技能培训模块一项目三任务三协助老年人进行口腔吸痰.pptx VIP
- 2025年安徽皖江高速公路有限公司高速公路收费人员招聘考试备考题库及答案解析.docx VIP
- 2025年安徽皖江高速公路有限公司高速公路收费人员招聘笔试备考试题及答案解析.docx VIP
- 完整版2025年开学思政第一课.ppt VIP
- 2025年安徽皖江高速公路有限公司高速公路收费人员招聘考试备考试题及答案解析.docx VIP
- 写作载体与写作受体.ppt VIP
- 电子科技大学博士、硕士学位授权点一览表最终.docx VIP
文档评论(0)