中点画线算法

Download Report

Transcript 中点画线算法

中点画线算法
讲授者:曲 毅
计算机图形学
图形扫描转换
直线扫描转换
中点画线算法
在
纸
上
VS和P (5,3)的直线段
画一条连接点P (1,1)
扫描
转换
0
1
(连续的)
就是要找出显示平面上最佳逼近
理想直线的那些象素的坐标值,
并将这些象素置成所要求的颜色
中点法
(离散的)
在
屏
幕
上
算 法 原 理
条件背景
过点(x0,y0)、(x1, y1)的直线段L的方程为
F(x, y)=ax+by+c=0,其中,
a=y0-y1, b=x1-x0, c=x0y1-x1y0
假定直线斜率k在0~1之间(x方向
步进1,求y的取值)
当前象素点为P (xp,yp)
下一个象素点有两种可选择点
Pu(xp+1,yp+1),Pd(xp+1,yp)
F(M)>0
Pu(xp+1,yp+1)
M(xp+1,yp+0.5)
P(xp,yp) Pd(xp+1,yp)
Pu与Pd的中点M(xp+1,yp+0.5)
判别方法
F(M)=0
F(M)的符号作为判别的依据
F(M)<0
F(M)<0时,点M在直线下方,取M上方点Pu 为下一个象素点
F(M)>0时,点M在直线上方,取M下方点Pd为下一个象素点
F(M)=0时,点M在直线上,取Pu 或Pd均可,默认取Pd为下一个象素点
算 法 实 现
初始值
xp=x0, yp=y0
判别式
d=F(M)=F(xp+1, yp+0.5)=a(xp+1)+b(yp+0.5)+c
下一像素点
x p 1  x p  1
y p 1
效率分析

 yp 1
 

yp
d  0
每一个像素的计算量是4个加法,2个乘法
乘法
注意到
d  0
加法
d是xp, yp的线性函数,可采用增量计算,提高运算效率
算 法 优 化
判别式增量
若当前象素处于d>=0情况,取Pd(xp+1, yp)
要判断下一个象素位置,应计算d= F(M’ )
=F(xp+2, yp+0.5)=a(xp+2)+b(yp+0.5)
=d+a
增量为a
M ’(xp+2,yp+0.5)
Pd(xp+1,yp)
M ’(xp+2,yp+1.5)
Pu(xp+1,yp+1)
若d<0时,则取象素Pu(xp+1, yp+1)
要判断再下一象素,则要计算 d= F(M’ )
= F(xp+2, yp+1.5)=a(xp+2)+b(yp+1.5)+c
=d+a+b
增量为a+b
算 法 优 化
判别式初值
画线从(x0, y0)开始,F(x0, y0)=0,
d 的初值 d0=F(x0+1, y0+0.5) =F(x0, y0)+a+0.5b=a+0.5b
效率分析
注意到
整数化改进
浮点数
整数
我们使用的只是d的符号,而且d的增量都是整数,只是初始
值包含小数。因此,我们可以用2d代替d来摆脱浮点数
把初始值和2个增量都扩大2倍
d0=2a+b
d增量=2a
d增量=2a+2b
算 法 总 结
条件整合
算法流程
初始化a=y0-y1; b=x1-x0
d=2a+b, d1=2a;d2=2(a+b)
x=x0;y=y0;画像素(x, y)
起点(x0,y0)、终点(x1, y1)
F(x, y)=ax+by+c=0,
a=y0-y1, b=x1-x0
d0  2a  b
x<x1?
y p 1
2(a  b)
d  
2a
结束
Y
x p 1  x p  1

 yp 1


yp
N
d 0
d 0
d 0
d 0
d<0?
N
Y
x=x+1
y=y+1
d=d+d2
画像素(x, y)
x=x+1
d=d+d1
算 法 实 例
用中点画线方法扫描转换连接两点P0(0,0)和P1(5,2)的直线段
初始条件
动画演示
a=y0-y1=-2; b=x1-x0=5;
d0=2a+b=1;
d1=2a=-4;d2=2(a+b)=6
起始点
终止点
当前像素点
下一个像素点
实现过程
x
y
d
0
0
1
1
0
-3
2
1
3
3
1
-1
4
2
5
5
2
1
3
2
1
0
1
2
3
4
5
算 法 实 例
用中点画线方法扫描转换连接两点P0(0,0)和P1(5,2)的直线段
初始条件
动画演示
a=y0-y1=-2; b=x1-x0=5;
d0=2a+b=1;
d1=2a=-4;d2=2(a+b)=6
起始点
终止点
当前像素点
下一个像素点
实现过程
x
y
d
0
0
1
1
0
-3
2
1
3
3
1
-1
4
2
5
5
2
1
3
2
1
0
1
2
3
4
5
将中点画线法
推广
到
任意斜率 的直线段