Algorytm generowania koła

Rysowanie okręgu na ekranie jest trochę skomplikowane niż rysowanie linii. Istnieją dwa popularne algorytmy generowania okręgu -Bresenham’s Algorithm i Midpoint Circle Algorithm. Algorytmy te opierają się na idei wyznaczania kolejnych punktów potrzebnych do narysowania okręgu. Omówmy szczegółowo algorytmy -

Równanie koła to $ X ^ {2} + Y ^ {2} = r ^ {2}, $ gdzie r jest promieniem.

Algorytm Bresenham

Nie możemy wyświetlić ciągłego łuku na ekranie rastrowym. Zamiast tego musimy wybrać najbliższą pozycję piksela, aby zakończyć łuk.

Na poniższej ilustracji widać, że umieściliśmy piksel w miejscu (X, Y) i teraz musimy zdecydować, gdzie umieścić następny piksel - w N (X + 1, Y) lub w S (X + 1, Y-1).

Decyduje o tym parametr decyzyjny d.

  • Jeśli d <= 0, to N (X + 1, Y) należy wybrać jako następny piksel.
  • Jeśli d> 0, to S (X + 1, Y-1) ma być wybrany jako następny piksel.

Algorytm

Step 1- Uzyskaj współrzędne środka okręgu i promienia i zapisz je odpowiednio w x, y i R. Ustaw P = 0 i Q = R.

Step 2 - Ustaw parametr decyzyjny D = 3 - 2R.

Step 3 - Powtórz krok 8, gdy P ≤ Q.

Step 4 - Call Draw Circle (X, Y, P, Q).

Step 5 - Zwiększ wartość P.

Step 6 - Jeśli D <0, to D = D + 4P + 6.

Step 7 - W przeciwnym razie ustaw R = R - 1, D = D + 4 (PQ) + 10.

Step 8 - Call Draw Circle (X, Y, P, Q).

Draw Circle Method(X, Y, P, Q).

Call Putpixel (X + P, Y + Q).
Call Putpixel (X - P, Y + Q).
Call Putpixel (X + P, Y - Q).
Call Putpixel (X - P, Y - Q).
Call Putpixel (X + Q, Y + P).
Call Putpixel (X - Q, Y + P).
Call Putpixel (X + Q, Y - P).
Call Putpixel (X - Q, Y - P).

Algorytm punktu środkowego

Step 1 - Promień wejściowy r i środek okręgu $ (x_ {c,} y_ {c}) $ i uzyskaj pierwszy punkt na obwodzie koła ze środkiem na początku jako

(x0, y0) = (0, r)

Step 2 - Obliczyć początkową wartość parametru decyzyjnego jako

$ P_ {0} $ = 5/4 - r (Zobacz poniższy opis w celu uproszczenia tego równania).

f(x, y) = x2 + y2 - r2 = 0

f(xi - 1/2 + e, yi + 1)
        = (xi - 1/2 + e)2 + (yi + 1)2 - r2 
        = (xi- 1/2)2 + (yi + 1)2 - r2 + 2(xi - 1/2)e + e2
        = f(xi - 1/2, yi + 1) + 2(xi - 1/2)e + e2 = 0
Let di = f(xi - 1/2, yi + 1) = -2(xi - 1/2)e - e2
Thus,

If e < 0 then di > 0 so choose point S = (xi - 1, yi + 1).
di+1    = f(xi - 1 - 1/2, yi + 1 + 1) = ((xi - 1/2) - 1)2 + ((yi + 1) + 1)2 - r2
        = di - 2(xi - 1) + 2(yi + 1) + 1
        = di + 2(yi + 1 - xi + 1) + 1
		  
If e >= 0 then di <= 0 so choose point T = (xi, yi + 1)
   di+1 = f(xi - 1/2, yi + 1 + 1)
       = di + 2yi+1 + 1
		  
The initial value of di is
   d0 = f(r - 1/2, 0 + 1) = (r - 1/2)2 + 12 - r2
      = 5/4 - r {1-r can be used if r is an integer}
		
When point S = (xi - 1, yi + 1) is chosen then
   di+1 = di + -2xi+1 + 2yi+1 + 1
	
When point T = (xi, yi + 1) is chosen then
   di+1 = di + 2yi+1 + 1

Step 3 - Na każdej pozycji $ X_ {K} $ zaczynającej się od K = 0, przeprowadź następujący test -

If PK < 0 then next point on circle (0,0) is (XK+1,YK) and
   PK+1 = PK + 2XK+1 + 1
Else
   PK+1 = PK + 2XK+1 + 1 – 2YK+1
	
Where, 2XK+1 = 2XK+2 and 2YK+1 = 2YK-2.

Step 4 - Określ punkty symetrii w pozostałych siedmiu oktantach.

Step 5 - Przenieś każdą obliczoną pozycję piksela (X, Y) na ścieżkę kołową wyśrodkowaną na $ (X_ {C,} Y_ {C}) $ i wykreśl wartości współrzędnych.

X = X + XC,   Y = Y + YC

Step 6 - Powtórz kroki od 3 do 5, aż X> = Y.