Bilgisayar ekranımız matris biçiminde düzenlenmiş piksellerden oluştuğu için bilgisayar ekranında sürekli düzgün bir yay görüntülemek kolay değildir. Bu nedenle, bilgisayar ekranında bir daire çizmek için, her zaman yazdırılan pikselden en yakın pikselleri seçmeliyiz, böylece bunlar bir yay oluşturabilir. Bunu yapmak için iki algoritma vardır:
- Orta Nokta daire çizim algoritması
- Bresenham'ın daire çizim algoritması
konuyu zaten tartışmıştık Orta Nokta daire çizim algoritması Bir önceki yazımızda. Bu yazımızda Bresenham'ın daire çizme algoritmasından bahsedeceğiz.
mylivecriclet
Bu algoritmaların her ikisi de dairenin temel özelliği olan oldukça simetrik olmasını kullanır. Yani 360 derecelik dairenin tamamını 45 derecelik her sekizlik parçaya 8 parçaya böleceğiz. Bunu yapabilmek için 45 derecenin ilk oktantındaki piksellerin konumlarını hesaplamak için Bresenham Daire Algoritmasını kullanacağız. Çemberin orijin üzerinde ortalandığını varsayar. Böylece her piksel (x y) için aşağıda gösterildiği gibi dairenin 8 oktanının her birine bir piksel çizdiğimizi hesaplar:
Bir piksel (xy) için 8 oktandaki olası tüm pikseller
Şimdi daha önce bilinen bir piksel konumundan (x y) sonraki piksel konumunun nasıl hesaplanacağını göreceğiz. Bresenham algoritmasında herhangi bir (x y) noktasında doğudaki (x+1 y) veya güney doğudaki (x+1 y-1) sonraki pikseli seçmek için iki seçeneğimiz vardır.
Buna d karar parametresi kullanılarak şu şekilde karar verilebilir:
- Eğer d > 0 ise yaya daha yakın olacağı için bir sonraki piksel olarak (x+1 y-1) seçilecektir.
- aksi takdirde (x+1 y) sonraki piksel olarak seçilecektir.
Şimdi belirli bir 'r' yarıçapı ve merkez (xc yc) için daireyi çizmek için (0 r)'den başlayacağız ve ilk çeyrekte x=y'ye (yani 45 derece) kadar hareket edeceğiz. Listelenen başlangıç koşulundan başlamalıyız:
d = 3 - (2 * r)
x = 0
y = r
Şimdi her piksel için aşağıdaki işlemleri yapacağız:
Rajinikanth
- (xc yc) ve (x y)'nin başlangıç değerlerini ayarlayın.
- Karar parametresi d'yi d = 3 – (2 * r) olarak ayarlayın.
- DrawCircle(int xc int yc int x int y) işlevini çağırın.
- X'e kadar aşağıdaki adımları tekrarlayın.<= y:
- Eğer d< 0 set d = d + (4 * x) + 6.
- Aksi halde d = d + 4 * (x – y) + 10 olarak ayarlayın ve y'yi 1 azaltın.
- X'in değerini artırın.
- DrawCircle(int xc int yc int x int y) işlevini çağırın.
DrawCircle() işlevi:
CPP// function to draw all other 7 pixels // present at symmetric position drawCircle(int xc int yc int x int y) { putpixel(xc+x yc+y RED); putpixel(xc-x yc+y RED); putpixel(xc+x yc-y RED); putpixel(xc-x yc-y RED); putpixel(xc+y yc+x RED); putpixel(xc-y yc+x RED); putpixel(xc+y yc-x RED); putpixel(xc-y yc-x RED); }
Aşağıda yukarıdaki yaklaşımın C uygulaması verilmiştir.
CPP// C-program for circle drawing // using Bresenham’s Algorithm // in computer-graphics #include #include #include // Function to put pixels // at subsequence points void drawCircle(int xc int yc int x int y){ putpixel(xc+x yc+y RED); putpixel(xc-x yc+y RED); putpixel(xc+x yc-y RED); putpixel(xc-x yc-y RED); putpixel(xc+y yc+x RED); putpixel(xc-y yc+x RED); putpixel(xc+y yc-x RED); putpixel(xc-y yc-x RED); } // Function for circle-generation // using Bresenham's algorithm void circleBres(int xc int yc int r){ int x = 0 y = r; int d = 3 - 2 * r; drawCircle(xc yc x y); while (y >= x){ // check for decision parameter // and correspondingly // update d y if (d > 0) { y--; d = d + 4 * (x - y) + 10; } else d = d + 4 * x + 6; // Increment x after updating decision parameter x++; // Draw the circle using the new coordinates drawCircle(xc yc x y); delay(50); } } int main() { int xc = 50 yc = 50 r = 30; int gd = DETECT gm; initgraph(&gd &gm ''); // initialize graph circleBres(xc yc r); // function call return 0; }
Çıkış:

Avantajları
- Bu basit bir algoritmadır.
- Kolayca uygulanabilir
- Tamamen daire denklemine dayanmaktadır, yani x2+y2=r2
Dezavantajları
- Puan oluştururken doğruluk sorunu yaşanıyor.
- Bu algoritma karmaşık ve yüksek grafikli görüntüler için uygun değildir.