Algorytm generacji linii

Linia łączy dwa punkty. To podstawowy element grafiki. Aby narysować linię, potrzebujesz dwóch punktów, między którymi możesz narysować linię. W poniższych trzech algorytmach jeden punkt linii określamy jako $ X_ {0}, Y_ {0} $, a do drugiego punktu linii jako $ X_ {1}, Y_ {1} $.

Algorytm DDA

Algorytm Digital Differential Analyzer (DDA) to prosty algorytm generowania linii, który jest tutaj wyjaśniony krok po kroku.

Step 1 - Uzyskaj dane wejściowe dwóch punktów końcowych $ (X_ {0}, Y_ {0}) $ i $ (X_ {1}, Y_ {1}) $.

Step 2 - Oblicz różnicę między dwoma punktami końcowymi.

dx = X1 - X0
dy = Y1 - Y0

Step 3- W oparciu o obliczoną różnicę w kroku 2, musisz określić liczbę kroków do umieszczenia piksela. Jeśli dx> dy, potrzebujesz więcej kroków we współrzędnej x; w przeciwnym razie we współrzędnej y.

if (absolute(dx) > absolute(dy))
   Steps = absolute(dx);
else
   Steps = absolute(dy);

Step 4 - Oblicz przyrost we współrzędnej x i współrzędnej y.

Xincrement = dx / (float) steps;
Yincrement = dy / (float) steps;

Step 5 - Umieść piksel, odpowiednio zwiększając współrzędne xiy, i zakończ rysowanie linii.

for(int v=0; v < Steps; v++)
{
   x = x + Xincrement;
   y = y + Yincrement;
   putpixel(Round(x), Round(y));
}

Bresenham's Line Generation

Algorytm Bresenham to kolejny algorytm konwersji przyrostowej skanowania. Dużą zaletą tego algorytmu jest to, że używa tylko obliczeń całkowitych. Poruszając się po osi X w jednostkowych odstępach i na każdym kroku wybieraj jedną z dwóch różnych współrzędnych y.

Na przykład, jak pokazano na poniższej ilustracji, z pozycji (2, 3) należy wybrać pomiędzy (3, 3) a (3, 4). Chciałbyś, aby punkt był bliżej oryginalnej linii.

W pozycji próbki $ X_ {k} + 1, $ pionowe separacje od linii matematycznej są oznaczone jako $ d_ {górne} $ i $ d_ {dolne} $.

Na powyższej ilustracji współrzędna y na linii matematycznej przy $ x_ {k} + 1 $ wynosi -

Y = m ($ X_ {k} $ + 1) + b

Zatem $ d_ {upper} $ i $ d_ {lower} $ są podane w następujący sposób -

$$ d_ {lower} = y-y_ {k} $$

$$ = m (X_ {k} + 1) + b - Y_ {k} $$

i

$$ d_ {upper} = (y_ {k} + 1) - y $$

$ = Y_ {k} + 1 - m (X_ {k} + 1) - b $

Możesz ich użyć, aby podjąć prostą decyzję o tym, który piksel znajduje się bliżej linii matematycznej. Ta prosta decyzja opiera się na różnicy między dwoma położeniami pikseli.

$$ d_ {dolny} - d_ {górny} = 2m (x_ {k} + 1) - 2y_ {k} + 2b - 1 $$

Podstawmy m przez dy / dx, gdzie dx i dy są różnicami między punktami końcowymi.

$$ dx (d_ {dolny} - d_ {górny}) = dx (2 \ frac {\ mathrm {d} y} {\ mathrm {d} x} (x_ {k} + 1) - 2y_ {k} + 2b - 1) $$

$$ = 2dy.x_ {k} - 2dx.y_ {k} + 2dy + 2dx (2b-1) $$

$$ = 2dy.x_ {k} - 2dx.y_ {k} + C $$

Zatem parametr decyzyjny $ P_ {k} $ dla k- tego kroku wzdłuż linii jest określony wzorem -

$$ p_ {k} = dx (d_ {dolny} - d_ {górny}) $$

$$ = 2dy.x_ {k} - 2dx.y_ {k} + C $$

Znak parametru decyzyjnego $ P_ {k} $ jest taki sam jak znak $ d_ {dolny} - d_ {górny} $.

Jeśli $ p_ {k} $ jest ujemne, wybierz dolny piksel, w przeciwnym razie wybierz górny piksel.

Pamiętaj, że zmiany współrzędnych następują wzdłuż osi x w krokach jednostkowych, więc możesz zrobić wszystko z obliczeniami całkowitymi. W kroku k + 1 parametr decyzyjny jest podawany jako -

$$ p_ {k +1} = 2dy.x_ {k + 1} - 2dx.y_ {k + 1} + C $$

Odejmując $ p_ {k} $ od tego otrzymujemy -

$$ p_ {k + 1} - p_ {k} = 2dy (x_ {k + 1} - x_ {k}) - 2dx (y_ {k + 1} - y_ {k}) $$

Ale $ x_ {k + 1} $ to to samo, co $ (xk) + 1 $. Więc -

$$ p_ {k + 1} = p_ {k} + 2dy - 2dx (y_ {k + 1} - y_ {k}) $$

Gdzie $ Y_ {k + 1} - Y_ {k} $ wynosi 0 lub 1 w zależności od znaku $ P_ {k} $.

Pierwszy parametr decyzyjny $ p_ {0} $ jest oceniany na $ (x_ {0}, y_ {0}) $ jest podawany jako -

$$ p_ {0} = 2dy - dx $$

Mając na uwadze wszystkie powyższe punkty i obliczenia, oto algorytm Bresenham dla nachylenia m <1 -

Step 1 - Wprowadź dwa punkty końcowe linii, przechowując lewy punkt końcowy w $ (x_ {0}, y_ {0}) $.

Step 2 - Wykreśl punkt $ (x_ {0}, y_ {0}) $.

Step 3 - Oblicz stałe dx, dy, 2dy i (2dy - 2dx) i uzyskaj pierwszą wartość parametru decyzyjnego jako -

$$ p_ {0} = 2dy - dx $$

Step 4 - Przy każdym $ X_ {k} $ wzdłuż linii, zaczynając od k = 0, wykonaj następujący test -

Jeśli $ p_ {k} $ <0, następnym punktem na wykresie jest $ (x_ {k} +1, y_ {k}) $ i

$$ p_ {k + 1} = p_ {k} + 2dy $$ W przeciwnym razie

$$ (x_ {k}, y_ {k} +1) $$

$$ p_ {k + 1} = p_ {k} + 2dy - 2dx $$

Step 5 - Powtórz krok 4 (dx - 1) razy.

Dla m> 1, dowiedz się, czy musisz zwiększać x, zwiększając jednocześnie y za każdym razem.

Po rozwiązaniu równanie dla parametru decyzyjnego $ P_ {k} $ będzie bardzo podobne, tylko x i y w równaniu zostaną zamienione.

Algorytm punktu środkowego

Algorytm punktu środkowego zawdzięczamy Bresenhamowi, który został zmodyfikowany przez Pittewaya i Van Akena. Załóżmy, że punkt P został już umieszczony we współrzędnej (x, y), a nachylenie linii wynosi 0 ≤ k ≤ 1, jak pokazano na poniższej ilustracji.

Teraz musisz zdecydować, czy umieścić następny punkt na E, czy N. Można to wybrać, identyfikując punkt przecięcia Q najbliższy punktowi N lub E. Jeśli punkt przecięcia Q jest najbliżej punktu N, wówczas N jest uważane za następny punkt; inaczej E.

Aby to ustalić, najpierw oblicz punkt środkowy M (x + 1, y + ½). Jeśli punkt przecięcia Q prostej z pionową linią łączącą E i N znajduje się poniżej M, to E jako następny punkt; w przeciwnym razie weź N jako następny punkt.

Aby to sprawdzić, musimy rozważyć niejawne równanie -

F (x, y) = mx + b - y

Dla dodatniego m przy dowolnym danym X,

  • Jeśli y jest na linii, to F (x, y) = 0
  • Jeśli y jest powyżej linii, to F (x, y) <0
  • Jeśli y jest poniżej linii, to F (x, y)> 0