直线扫描转换-DDA算法
直线段的扫描转换算法
已知两个点,求直线。
为了在光栅显示器上用这些离散的像素点逼近这条直线,需要知道这些像素点的x,y坐标。
求出过P0,P1的直线段方程:
y=kx+b
k=(y1-y0)/(x1-x0)
假设x已知,即从x的起点x0开始,沿x方向前进一个像素(步长= 1),可以计算出相应的y值。
因为像素的坐标是整数,所以y值还要进行取整处理。
如何把数学上的一个点扫描转换一个屏幕像素点?
p(1.7,0.8) ->(1,0)
p(1.7,0.8) +0.5->(2.2,1.3)
p(2.2,1.3) ->(2,1)
直线是最基本的图形,一个动画或真实感图形往往需要调用成千上万次画线程序,因此直线算法的好坏与效率将直接影响图形的质量和显示速度。
为了提高效率,把计算量减下来,关键问题就是如何把乘法取消.
1、数值微分法(DDA)
2、中点画线法
3、Bresenham算法
数值微分DDA(Digital Differential Analyzer)法
引进图形学中一个很重要的思想---增量思想
yi=kxi+b
yi+1=kxi+1+b
=k(xi+1)+b
=kxi+k+b
=kxi+b+k
=yi+k
yi+1=yi+k
这个式子的含义是:当前步的y值等于前一步的y值加上斜率k
这样就把原来一个乘法和加法变成了一个加法
用DDA扫描转换连接两点P0(0,0)和P1(5,3)的直线段。
k=(3-0)/(5-0)=0.6<1
yi+1=yi+k
x | y | int(y+0.5) |
0 | 0 | 0 |
1 | 0+0.6 | 1 |
2 | 0.6+0.6 | 1 |
3 | 1.2+0.6 | 2 |
4 | 1.8+0.6 | 2 |
5 | 2.4+0.6 | 3 |
问题:DDA画直线算法:x每递增1,y递增斜率k。是否适合任意斜率的直线?
答案:不适合
当|k|>1时,如果还适用这种方法会导致点太少。
如直线点从(0,0)到(2,100),也只用3个点来表示,这样明显不合适。
因此当|k|>1时,交换x和y的位置。也就是以单位y间隔(δy=1)取样,顺序计算每个x值。
xi+1=xi+1/k
如从点0.0到点2,5
1/k=2/5=0.4
y | x | int(x+0.5) |
0 | 0 | 0 |
1 | 0+0.4 | 0 |
2 | 0.4+0.4 | 1 |
3 | 0.8+0.4 | 1 |
4 | 1.2+0.4 | 2 |
5 | 1.6+0.4 | 2 |
来源:https://www.cnblogs.com/cnblog-wuran/p/9664702.html