「圖形學」直線掃描——Bresenham算法改進了中點Bresenham算法?


前言

博主目前在學習《計算機圖形學基礎》這本書,使用的是第二版。

此書第五章開始講解基本圖形生成算法。

在5.1.3 Bresenham算法中,如是寫到:

雖然中點Bresenham算法是一種效率非常高的算法,但也還有改進的余地。

而后,開始介紹Bresenham算法。

 

思考

然而通過學習和理解,博主發現這兩種算法的原理完全相同:

每次在最大位移方向上走一步,而另一個方向上走步還是不走步取決於誤差項的判別。

於是博主產生了疑問:

Bresenham算法真的改進了中點Bresenham算法嗎?
如果是,到底改進了哪里?

 

分析

博主認為

兩種算法核心均是在尋找最接近實際值的格點

均是以格點的二分之一處為分界線

均是逐位依次掃描

思維以及處理方式不同

所以猜測

這兩種算法等價,並沒有高低之分,更沒有所謂改進

 

證明

博主在此提供的是證明其編程代碼等價,由此說明兩種算法在效率上是完全一致的。

中點Bresenham

void MidBresenhamLine(int x0, int y0, int x1, int y1) 
{
    int dx, dy;
    int d, UpIncre, DownIncre;
    int x, y; 
    if(x0 > x1) 
    { 
        x = x1; 
        x1 = x0; 
        x0 = x; 
        y = y1; 
        y1 = y0; 
        y0 = y; 
    }
    x = x0; 
    y = y0; 
    dx = x1 - x0; 
    dy = y1 - y0; 
    d = dx - 2 * dy; 
    UpIncre = 2 * dx - 2 * dy; 
    DownIncre = -2 * dy; 
    while(x <= x1) 
    {
        putpixel(x, y);
     x
++; if(d < 0) { y++; d += UpIncre; } else { d += DownIncre; } } }

 

Bresenham

void BresenhamLine(int x0, int y0, int x1, int y1) 
{
    int dx, dy;
    int e; int x, y;
    if(x0 > x1)
    {
        x = x1; 
        x1 = x0; 
        x0 = x; 
        y = y1;
        y1 = y0;
        y0 = y;
    }
    dx = x1 - x0; 
    dy = y1 - y0; 
    x = x0; 
    y = y0; 
    e = -dx; 
    while(x <= x1) 
    {
        putpixel(x, y);
     x
++; e = e + 2 * dy; if(e > 0) { y++; e = e - 2 * dx; } } }

 

兩段代碼在迭代計算x、y的部分:

x++;
if(d < 0)
{
    y++;
    d += UpIncre;
}
else
{
    d += DownIncre;
}
x++;
e = e + 2 * dy;
if(e > 0) 
{ 
  y++;
  e = e - 2 * dx;
}

 

令e = –a - 2 * dy ,此時 初始化 a = dx – 2 * dy

后者代入得:

x++;
a = a - 2 * dy;
if(a < -2 * dy)
{
    y++;
    a = a + 2 * dx;
}

 

令a = d - 2 * dy , 此時,初始化 d = dx

x++;
d = d - 2 * dy;
if( d < 0)
{
    y++;
    d = d + 2 * dx;
}

 

此時,使初始化 d = dx – 2 * dy 

代碼塊等價變換得

x++;
if( d < 0)
{
    y++;
    d = d + 2 * dx;
}
d = d - 2 * dy;

 

又可變換為

x++;
if( d < 0)
{
    y++;
    d = d + 2 * dx;
    d = d - 2 * dy;
}
else
{
    d = d - 2 * dy;
}

 

很容易看出該代碼塊與中點Bresenham算法的核心代碼塊完全等價

x++;
if(d < 0)
{
    y++;
    d += UpIncre;
}
else
{
    d += DownIncre;
}

 

結論

這兩種算法等價,並沒有高低之分,更沒有所謂改進


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM