計算機圖形學——圓的掃描轉換(基本光柵圖形算法)


       與直線的生成類似,圓弧生成算法的好壞直接影響到繪圖的效率。本篇博客將討論圓弧生成的3個主要算法,正負法、Bresenham法和圓的多邊形迫近法,在介紹算法時,只考慮圓心在原點,半徑為R的情況。

一、正負法

1、基本原理 

假設已選取Pi-1為第i-1個像素,則如果Pi-1在圓內,就要向圓外方向走一步;若已在圓外就要向圓內走一步。
總之,盡量貼近圓的輪廓線

2、正負法的具體實現

1)圓的表示:設圓的圓心為(0,0),半徑為R,則圓的方程為:
      F(x,y)=x2+y2–R2=0  
當點(x,y)在圓內時,F(x,y)<0。
當點(x,y)在圓外時,F(x,y)>0。

2)實現步驟
第1步:x0=0,y0=R
第2步:
 求得Pi(xi,yi)后找點Pi+1的原則為:

當Pi在圓內時(F(xi,yi)≤0),要向右走一步得Pi+1,這是向圓外方向走去。取xi+1= xi+1, yi+1= yi
當Pi在圓外時(F(xi,yi)>0),要向下走一步得Pi+1,這是向圓內方向走去,取xi+1= xi, yi+1= yi-1

用來表示圓弧的點均在圓弧附近且 F(xi, yi)時正時負

假設已經得到點(xi, yi),則容易算出F(xi, yi),即確定了下一個點(xi+1, yi+1),則如何計算F(xi+1, yi+1),以確定下下個點(xi+2, yi+2)?

分為兩種情況:
右走一步后:xi+1=xi+1,yi+1=yi,此時:
F(xi+1, yi+1)=xi+12+yi2-R2  =xi2+yi2-R2+2xi+1 = F(xi, yi)+2xi+1

下走一步后:xi+1=xi,yi+1=yi-1, 此時:
F(xi+1, yi+1)=xi2+(yi-1)2-R2   = F(xi, yi)-2yi+1

由此可得:

確定了F(xi+1, yi+1)之后,即可決定下一個點(xi+2, yi+2),選擇道理同上。

二、Bresenham 生成圓弧的算法

Bresenham算法是最常用的畫圓的算法之一假設圓心(0,0)為原點,考慮AB弧的畫法,顯示一個整圓時,只要在顯示AB上任一點(x,y)時,同時顯示在圓周上其它七個對稱點(y,x), (y,-x), (x,-y), (-x,-y),(-y,-x), (-y,x), (-x,y)。

 1、基本原理

考慮AB弧段,x每步增加1,從 x=0開始,到x=y結束。
即有:
    xi+1=xi+1  相應的yi+1則在兩種可能中選擇 yi+1=yi (Hi)或者 yi+1=yi-1(Li)
所以:
   選擇的原則是確定這兩個點哪一個更接近於圓弧。

 即:設Pi-1是已選中的一個表示圓弧上的點,下一個點應從Hi或Li中選擇。設Hi和Li兩點的坐標分別為(xhi, yhi)和(xli, yli)

設R為弧AB的半徑,記點P到原點的距離的平方與圓的半徑的平方之差為D(P),即

 

 2、遞推公式

   di決定的是(xi, yi),即Hi和Li哪個被選中
   di+1則決定的是(xi+1, yi+1),即Hi+1和Li+1哪個被選中

當di<0時,點Hi被選中, xi= xi-1+1, yi=yi-1,由 (3.13)和(3.14)得
                  di+1= di+ 4xi+2= di+ 4xi-1+6                  
當di≥0時,點Li被選中, xi= xi-1+1,yi= yi-1-1,由(3.13)和(3.14)得
                di+1=di+4xi-4yi-1+6=di+4(xi-1-yi-1)+10

3、代碼實現

 根據上面得到的遞推表達式,可以獲得該算法生成弧AB的代碼如下:

void bresenham_arc(Graphics g,int radius)
{
    int x,y,d;
    x = 0;
    y = radius;
    d = 3-2*radius;//d1
    while (x < y)
    {
        g.drawLine(x, y, x, y);
        if (d<0)
            d=d+4*x+6;
        else
        {
            d=d+4*(x-y)+10;
            y--;
        }
        x++;
    }
    if (x == y)
        g.drawLine(x,y,x,y);
}

Bresenham算法在候選的兩個像素中,總是選定離圓弧最近的像素為圓弧的一個近似點,因此,Bresenham算法比正負法決定的像素更合理。

三、圓的多邊形迫近法

 1、基本思想

       將整個圓弧等分成一段段的短直線,用這些短直線形成的折線來逼近圓弧。為了獲得這些短直線,只需按一定的方式計算給定圓弧軌跡上一系列頂點,短直線的繪制可采用直線的生成算法,如果將圓弧分割的足夠密,則短直線將足夠短,形成的折線將可以和圓弧接近到任意程度,因此在允許的誤差范圍內,可以用顯示折線代替顯示圓弧。

2、圓弧的離散生成

設圓的圓心為c(0,0),半徑為R。假設圓弧的起始角和終止角分別為α0和α1,把圓弧分割為n份,則兩個頂點之間的夾角為 α=( α1 - α0 )/n 。

設內接正多邊形的一個頂點為Pi(xi,yi),cPi的幅角為θi,則
          xi=Rcosθi
          yi=Rsinθi
頂點Pi+1的坐標為
  xi+1=Rcos(θi+α)= xicosα-yisinα
  yi+1=Rsin(θi+α)= xisinα+yicosα

或表示為矩陣形式:

 

 計算一個點(xi+1,yi+1)只要作四次乘法。

 

 由此決定了一系列頂點,兩個定點確定一條直線,n條直線逼近了個整個圓。


免責聲明!

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



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