- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第三章 二维图形生成技术;3.1 直线图形
一. 生成直线的 DDA 算法
无论是光栅扫描显示器还是绘图机,都可以看成有一个网格(离散单元组成的矩阵)存在,对显示器来说每一个像素就是一个网格点,对绘图机来说笔每走一步的终点也可以看成是一个网格的结点。
在光栅扫描显示器上表示一条
直线,就是要用最靠近直线的一
些网格点来代表这一直线。
这个网格就构成屏幕和绘图机
纸张的一个坐标系,相邻两个网
点的距离取为1,每个网格点的坐
标均取整数。; 假设 直线的起点坐标为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 方向网格线的交点,但显示时要用象素点(图中的网格结点)来表示,所以要用舍入的办法耒找到最靠近交点处的象素点,并用其来表示直线段。
这个方法称之为数字微分分析法,简称DDA。;算法描述如下:
int x1,y1,x2,y2;
int x;
float dx,dy,k,y;
dx=x2 - x1 ;
dy=y2 - y1 ;
k=dy/dx ;
x=x1 ;
y=y1 ;
for (x=x1;x<=x2;x++)
{
putpixel (x,(int)y,pixelcolor ) ;
y=y+k ;
}
该算法仅适用于|k|≤1 的情况,而当|k|>1时,则需将 x 和 y 的位置交换。;;二. 生成直线的 Bresenham 算法
设 k=△y/△x , 先讨论 0≤k≤1的情况:
若以屏幕上x方向的象素点作为横坐标,则有 xi+1-xi=1
而 yi+1=yi+k(xi+1-xi)=yi+k (1)
设 b 点是直线上的点,其坐标是(xi+1,yi+1),显然,该点只能用屏幕上的象素点c 或 d 来表示。
设 a 为c、d 的中点,若 b 在
a 的上面则应取 d,否则应取 c。
关键问题:
(1) 如何判断 b是在 a 的上面还是
下面,设置一个标志变量 e ;
(2) 如何建立标志变量 e 的递推公式。; 设 e (xi+1)=yi+1-yi′-0.5 (2)
若b在a的下面,则有 e (xi+1)0
若b在a的上面,则有 e (xi+1)0
由图中可知:当e (xi+1)≥0时 y′i+1=yi′+1
e (xi+1) 0时 y′i+1=yi'
递推:
由(2)、(3)式可得:
e (xi+2)=yi+2-y′i+1-0.5=yi+1+k-y′i+1-0.5
yi+1-yi′-0.5+k-1 e (xi+1)≥0
yi+1-yi′-0.5+k e (xi+1) 0
e (xi+1)+k-1 e (xi+1)≥0
e (xi+1)+k e (xi+1) 0;算法描述如下:
△x=x2-x1
△y=y2-y1
k=△y/△x
e =k-0.5 (若起始点在象素中心,则e的初始值为-0.5)
x=x1
y=y1
for ( i=1;i<=△x;i++)
{
putpixel (x,y,pixelcolor)
x=x+1
文档评论(0)