直線繪製算法

目錄


 

三種常用直線繪製算法:

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. 例題:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章