Xiaolin Wu Çizgi Algoritması

16618
Xiaolin Wu Çizgi Algoritması

Bilgisayar ekranında çizgiler nasıl oluşur desek elbet bir çoğunuz pikseller yardımı ile cevabını verebilirsiniz. Ancak piksellerin bir araya gelmesi ve bunların farklı karşıtlık derecesi ile gerçeğe yakın görünmesi gerçekte nasıl sağlanır bilmediğinizden eminim. Bu makaleyi okurken aynı zamanda bilgisayar mühendisleri için matematiğin ne kadar önemli olduğunu da anlamanızı sağlayacağını umuyorum.

Bilgisayarın anlayacağı tek bir dil vardır o da matematik! Bu sebeble ekranda basit bir çizgi bile oluşturmak istesek bunu matematiksel olarak ifade etmek zorundayız. Bilgisayarı gelişmiş hesap makinesi olarak düşünebilirsiniz. Aslında tam olarak da bir çizgiyi ekrana getirirken arka planda aşağıdaki algoritma kodları çalışmaktadır. Örneğin (1,1) noktasından (3,5) noktasına bir düz çizgi oluşturalım deseniz bunu analitik geometri dersindeki öğrendikleriz yardımıyla kolayca yapabilirdiniz. İşi biraz daha zorlaştıralım ve bu çizginin dışında kalanlar azalarak rengi beyaza doğru kaysın. Bu uğraşı alanına bilgisayar mühendisleri görüntü işleme analizi demektedir. Bunlar basit örnek olsada aslında bugün kullandığımız yüz tanımlama sistemleri, renk ayrıştırma analizleri vb tekniklerin temelinde burada olduğu gibi matematik yatmaktadır.

Xiaolin Wu‘nun çizgi algoritması da, line anti-aliasing (resmin farklı tonda piksellere sahip bölgelerin kenarlarında ara tonlara sahip pikseller oluşturma) tekniği için oluşturulmuş bir algoritmadır. Computer Graphics’in temmuz 1991 sayısında verimli bir anti-aliasing tekniği ve yine Dr. Dobb’s Journal’ın Haziran 1992 sayısında hızlı Anti-aliasing makalesi olarak yayınlanmıştır.

Daha önce kullanılan Bresenham’ın algoritması, hatları çok hızlı bir şekilde çiziyordu ancak kenar yumuşatma işlemini gerçekleştirememekteydi. Buna ek olarak, çizgi bitiş noktalarının piksel grid (ızgarasının) tam sayı noktaları (integer points) olmadığı durumları kesin olarak halledememekteydi. Wu’nun algoritması nispeten hızlıdır, ancak Bresenham’ın algoritmasından daha yavaştır. Algoritmanın mantığı, hattın her iki yanının çizgiden uzaklığına göre renklendirilmiş piksel çiftleri çizmekten ibarettir. Çizgi bitimindeki pikseller ayrıca ele alınır. Bir pikselden daha kısa çizgiler özel bir vaka olarak ele alınır.

Xiaolin Wu’nun Graphics Gems II adlı kitabında daire çizimi algoritmasını da yayımlamıştır. Wu’nun düz çizgi algoritması Bresenham’ın çizgi algoritması yerini aldığı gibi aynı şekilde Wu’nun daire çizme algoritması da Bresenham’ın daire çizme algoritması yerini almıştır.

Algoritma Örneği

function plot(x, y, c) is
    plot the pixel at (x, y) with brightness c (where 0 ≤ c ≤ 1)

// integer part of x
function ipart(x) is
    return int(x)

function round(x) is
    return ipart(x + 0.5)

// fractional part of x
function fpart(x) is
    if x < 0 return 1 - (x - floor(x)) return x - floor(x) function rfpart(x)
is return 1 - fpart(x) function drawLine(x0,y0,x1,y1)
is boolean steep := abs(y1 - y0) > abs(x1 - x0)
    
    if steep then
        swap(x0, y0)
        swap(x1, y1)
    end if
    if x0 > x1 then
        swap(x0, x1)
        swap(y0, y1)
    end if
    
    dx := x1 - x0
    dy := y1 - y0
    gradient := dy / dx
    
    // handle first endpoint
    xend := round(x0)
    yend := y0 + gradient * (xend - x0)
    xgap := rfpart(x0 + 0.5)
    xpxl1 := xend // this will be used in the main loop
    ypxl1 := ipart(yend)
    if steep then
        plot(ypxl1,   xpxl1, rfpart(yend) * xgap)
        plot(ypxl1+1, xpxl1,  fpart(yend) * xgap)
    else
        plot(xpxl1, ypxl1  , rfpart(yend) * xgap)
        plot(xpxl1, ypxl1+1,  fpart(yend) * xgap)
    end if
    intery := yend + gradient // first y-intersection for the main loop
    
    // handle second endpoint
    xend := round(x1)
    yend := y1 + gradient * (xend - x1)
    xgap := fpart(x1 + 0.5)
    xpxl2 := xend //this will be used in the main loop
    ypxl2 := ipart(yend)
    if steep then
        plot(ypxl2  , xpxl2, rfpart(yend) * xgap)
        plot(ypxl2+1, xpxl2,  fpart(yend) * xgap)
    else
        plot(xpxl2, ypxl2,  rfpart(yend) * xgap)
        plot(xpxl2, ypxl2+1, fpart(yend) * xgap)
    end if
    
    // main loop
    if steep then
        for x from xpxl1 + 1 to xpxl2 - 1 do
           begin
                plot(ipart(intery)  , x, rfpart(intery))
                plot(ipart(intery)+1, x,  fpart(intery))
                intery := intery + gradient
           end
    else
        for x from xpxl1 + 1 to xpxl2 - 1 do
           begin
                plot(x, ipart(intery),  rfpart(intery))
                plot(x, ipart(intery)+1, fpart(intery))
                intery := intery + gradient
           end
    end if
end function
  • Referanslar
    Abrash, Michael (June 1992). “Fast Antialiasing (Column)”. Dr. Dobb’s Journal. 17 (6): 139(7).
  • Wu, Xiaolin (July 1991). “An efficient antialiasing technique”. Computer Graphics. 25 (4): 143–152. doi:10.1145/127719.122734. ISBN 0-89791-436-8.
  • Wu, Xiaolin (1991). “Fast Anti-Aliased Circle Generation”. In James Arvo (Ed.). Graphics Gems II. San Francisco: Morgan Kaufmann. pp. 446–450. ISBN 0-12-064480-0.
Yazımızı Beğendiniz mi?
Furkan Gümüş

Karadeniz Teknik Üniversitesi Makine Mühendisliği bölümü mezunu. Yüksek lisans eğitimini Marmara Üniversitesinde Mekatronik alanında tamamladı. Uzmanlığı Robot ve Mekatronik Sistemler, Otomatik Kontrol, Mekanik Tasarım, Gömülü Sistem ve Kontrol Yazılımlarıdır.

Düşünceleriniz Nedir?

Lütfen yorumunuzu buraya yazınız.
Lütfen isminizi buraya yazını.