- 1、本文档共11页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第三章 基本图形生成算法
图形学中许多算法是与硬件有关的。在使用光栅扫描显示器(或其它通过阵列表示的设备)时,画面其实是一组离散的点(象素),并且象素是有大小的。因此光栅扫描显示器上显示的各种几何图形,都只是近似意义上的。
另外,图形输出算法与所使用的输出设备有关,比如使用某种笔式绘图仪,它有X和Y两个走笔方向。当确定A、B两个端点位置后,画线算法应确定一个走笔方向的序列,能使画笔从A点走到B点。以下左图是算法的示意,对应的走笔序列是Δx、Δy、Δx、Δx、Δy、Δx、Δx、Δy、Δx … 。注意放大看时该图形呈现为阶梯状。右图是对同一线段使用光栅扫描显示器输出(并使用画点算法)的效果。
由于画线设备目前较少使用,我们下面介绍的两个直线算法都是基于画点设备的(如光栅扫描显示器)。它们是DDA算法和Bresenham算法。书上介绍的中点画线算法本质上和Bresenham算法一致。
3.1.1 DDA画线算法
DDA (Digital Differential Analyzer)算法
假定已知线段以P0(x0,y0)、P1(x1,y1)为两个端点,并且x0≠x1 。由解析几何公式,我们得到斜率
m =Δy/Δx ,其中Δy=y1-y0 ,Δx=x1-x0 ,直线方程为
y = m·x + B 。下面为简化问题,假定|m|=1。 (由于坡度不大,不会有连续两个点的X坐标相同)
我们的目标是找到一组像素(整数坐标)近似表示该线段。也即n个点 (xi , yi) i=0,1,… n-1 的坐标。由于斜率小于等于1,此时,可使xi+1 = xi +1。
(如果Δx0, 则xi+1 = xi -1) 如果xi不是整数,我们只要先对x0四舍五入取整,再计算每个xi 。然后有
y i+1 = round(m·x i+1 + B) = round(m·(xi +1)+ B)= round(yi + m), 这里round表示四舍五入取整运算。
当|m|1时,则应使用yi+1 = yi +1。以及
xi+1 = round(xi+ h)。 (h=1/m)
这是一种最简单直接的算法,效果也是基本可以的。下面是用C语言给出的算法描述:
void LineDDA(int x0,int y0,int x1,int y1,int color)
{
// 从参数表定义蕴含着已知端点坐标是整数坐标,但如前所述,这不是必要的
// 这里假定x0x1,-1=m=1,如果不满足,则代码要复杂一些。
int x,y;
? float dx, dy, m;
? dx= float(x1-x0);
? dy= float(y1-y0);
? m=dy/dx;
? y=y0;
? for(x=x0; x= x1, x++) // x0x1不满足时条件要改为x=x1
{
Putpixel(x, int(y+0.5), color); // int(y+0.5) 相当于四舍五入取整
?????? y+=m; // Putpixel这里仅用于在逻辑上表示画一个像素的函数。
? }
}
注:在以前TurboC上Putpixel是实际可用的函数。
如果m1,则有
? dx= float(x1-x0);
? dy= float(y1-y0);
? h=dx/dy;
? x=x0;
? for(y=y0; y= y1, y++)
{
Putpixel(int(x+0.5),y,color);
?????? x += h;
? }
}
这个算法简单、容易理解,效率较高。但必须处理器具有处理浮点数的能力。下面的Bresenham画线算法,可以只用整数加法和进位操作完成计算,所以成为经典。
3.1.3 Bresenham画线算法
Bresenham算法是计算机图形学领域使用最广泛的直线生成算法。假设直线斜率 k ? [0, 1]。Bresenham画线算法的基本原理是:按直线从起点到终点的顺序计算直线与各垂直网格线的交点,然后确定该列像素中与此交点最近的像素。
因为斜率较小,所以每条垂直线上最多选取一个像素。如果像素点 Pi-1 (xi-1,yi-1) 是已经选定的离直线最近的像素点,现在要决定下一个像素点Pi是Ti 还是Si 。如图3-5所示。
其中,Pi (xi , yi),xi =xi-1+1,
当Pi=Ti时,yi = yi-1 +1 ;当Pi=Si时,yi = yi-1
显然,无论下一个像素点是Ti还是Si ,x方向都增1,即xi =xi-1+1,要决定的是y方向是否增1。由图3-5不难看出;
若s t , 则Si比较靠近理想直线,应选Si ;
若s≥t,则Ti比较靠近理想直线,应选Ti
文档评论(0)