Bresenham
W dawnych czasach, kiedy ludzie nadal pisali własne podstawowe procedury wideo do rysowania linii i okręgów, nie było niespotykane stosowanie do tego algorytmu linii Bresenhama.
Bresenham rozwiązuje ten problem: chcesz narysować linię na ekranie, która przesuwa dx
piksele w kierunku poziomym, jednocześnie rozciągając dy
piksele w kierunku pionowym. W liniach występuje nieodłączny „pływający” charakter; nawet jeśli masz piksele całkowite, skończysz na racjonalnych nachyleniach.
Algorytm musi być szybki, co oznacza, że może używać wyłącznie arytmetyki liczb całkowitych; i unika się bez mnożenia lub dzielenia, tylko dodawanie i odejmowanie.
Możesz to dostosować do swojego przypadku:
- Twój „kierunek x” (w sensie algorytmu Bresenhama) to Twój zegar.
- Twój „kierunek y” to wartość, którą chcesz zwiększyć (tj. Pozycja twojej postaci - ostrożnie, to nie jest tak naprawdę „y” twojego duszka lub cokolwiek na ekranie, bardziej abstrakcyjna wartość)
„x / y” tutaj nie jest położeniem na ekranie, ale wartością jednego z twoich wymiarów w czasie. Oczywiście, jeśli twój duszek biegnie w dowolnym kierunku po ekranie, będziesz mieć wiele Bresenhamów biegnących osobno, 2 dla 2D, 3 dla 3D.
Przykład
Powiedzmy, że chcesz przenieść swoją postać prostym ruchem od 0 do 25 wzdłuż jednej ze swoich osi. Ponieważ porusza się z prędkością 2,5, będzie tam przy klatce 10.
Jest to to samo co „rysowanie linii” od (0,0) do (10,25). Chwyć algorytm linii Bresenhama i pozwól mu działać. Jeśli zrobisz to dobrze (a kiedy ją przestudiujesz, bardzo szybko stanie się jasne, jak to zrobić dobrze), to wygeneruje dla ciebie 11 „punktów” (0,0), (1,2), (2, 5), (3,7), (4,10) ... (10,25).
Wskazówki dotyczące adaptacji
Jeśli przejdziesz do tego algorytmu i znajdziesz jakiś kod (Wikipedia zawiera dość duży traktat), musisz pamiętać o kilku rzeczach:
- Oczywiście działa na wszystkie rodzaje
dx
i dy
. Jesteś zainteresowany jednym konkretnym przypadkiem (tzn. Nigdy go nie będziesz mieć dx=0
).
- Zwykła implementacja będzie miała kilka różnych przypadków dla ćwiartek na ekranie, w zależności od tego, czy
dx
i dy
są pozytywne, negatywne, a także czy abs(dx)>abs(dy)
nie. Tutaj oczywiście również wybierasz to, czego potrzebujesz. Musisz szczególnie upewnić się, że kierunek, który zwiększa się o 1
każdy tik, jest zawsze twoim kierunkiem „zegarowym”.
Jeśli zastosujesz te uproszczenia, wynik będzie naprawdę bardzo prosty i całkowicie pozbędziesz się reali.