目錄
三種常用直線繪製算法:
1)數值微分法(Digital Differential Analyzer,DDA)
2)中點畫線法
3)Bresenham算法
數值微分法
1. 應用直線公式:F(x) = y = kx+b
2. 條件:
1> 斜率的絕對值 |k| <= 1。當|k| > 1時,交換x和y的位置,即公式變爲:x = y/k + (-b/k)
【爲什麼要求 |k| <= 1 ?這是爲了保證x+1,y只可能+0或+1,而不會+2,繼而造成直線的部分缺失】
2> y和k爲float型,且每一次運算後需要對y取整
3. 計算像素點:x+1,y+k(取整)
4. 代碼:
void DDALine(int x0, int y0, int x1, int y1, int color)
{
int x; /*像素點的x軸座標*/
float dx, dy, y, k; /*x與y的增量分別爲dx和dy,y爲y軸座標,k爲斜率*/
dx = x1 - x0, dy = y1 - y0; /*計算增量*/
k = dy / dx; /*計算斜率*/
y = y0; /*給y賦初值*/
for (x = x0; x < x1; x++) /*給x賦初值,並逐步向x1移動*/
{
drawpixel(x, int(y+0.5), color); /*給y取整,畫像素點*/
y=y+k; /*y+k,x+1*/
}
}
5. 缺點:對y的取整操作對硬件不友好。
中點畫線法
1. 應用直線公式:F(x,y) = a*x + b*y + c = 0
2. 條件:斜率的絕對值 |-a/b| <= 1
3. 計算:
1> 初始判別式 d0 = 2a + b
2> 根據判別式d的正負,求出新的y和d:d >= 0,y不變,d = d + 2a;d < 0,y + 1,d = d + 2a + 2b
4. 例題:
Bresenham算法
與中點畫線法類似。
1. 計算:
1> 初始判別式 d0 = 2dy - dx
2> 根據判別式d的正負,求出新的y和d:d >= 0,y + 1,d = d + 2(dy - dx);d < 0,y不變,d = d + 2dy
2. 例題: