Bresenham zmodyfikowany

czyli algorytm rysowania elips i okręgów

Przy jednym z projektów postanowiłem wykorzystać algorytm Bresenhama do rysowania elips. Niestety algorytm miał dla mnie jedną, poważną wadę - wykorzystanie punktu środkowego. Uniemożliwia to narysowanie elipsy o parzystej szerokości, bądź wysokości wyrażonej w pixelach. Jeśli ktoś ma pod ręką kartkę w kratkę, niech wskaże środek kwadratu o boku 16x16 kratek a zrozumie o co chodzi.

Potrzebowałem więc możliwości narysowania elipsy wpisanej w prostokąt o zadanych współrzędnych przeciwległych wierzchołków. Rozwiązanie okazało się stosunkowo prostym zabiegiem. Upraszczając - skoro środkiem kwadratu 16x16 są (bardzo umownie!) cztery punkty a nie jeden, należy dla każdego z nich jako środka, narysować odpowiednią część elipsy. Wystarczy zatem wprowadzenie dwóch zmiennych pomocniczych do algorytmu Bresenhama, które będą środek przesuwać jeśli szerokość lub wysokość parzysta, bądź - nie, jeśli nieparzysta.

Przykład kodu implementującego opisywany algorytm można pobrać stąd 

Na koniec, jako ciekawostka, dla porównania przykład jak rysuje zmodyfikowany algorytm Bresenhama w porównaniu do funkcji ellipse z biblioteki systemowej Windows - gdi32.

Tak rysuje funkcja ellipse z GDI32

A tak zmodyfikowany algorytm Bresenhama