Myślałem o platformach i wrogach poruszających się w kółko w starych grach 2D i zastanawiałem się, jak to zrobić. Rozumiem równania parametryczne i do tego jest trywialne użycie sin i cos, ale czy NES lub SNES mogą wykonywać wywołania trig w czasie rzeczywistym? Przyznaję, że to duża ignorancja, ale myślałem, że to kosztowne operacje. Czy jest jakiś sprytny sposób na tańsze obliczenie tego ruchu?
Pracowałem nad uzyskaniem algorytmu z tożsamości sumy wyzwalającej, która używałaby tylko wstępnie obliczonego wyzwalacza, ale wydaje się to skomplikowane.
Odpowiedzi:
Na sprzęcie, który opisujesz, powszechnym rozwiązaniem w ogólnym przypadku jest po prostu stworzenie tabeli przeglądowej dla funkcji trygonometrii, która była zainteresowana, czasami w połączeniu z stałymi punktami reprezentacji wartości.
Potencjalnym problemem związanym z tą techniką jest to, że zajmuje ona miejsce w pamięci, choć można to bagatelizować, wybierając niższą rozdzielczość danych w tabeli lub korzystając z okresowego charakteru niektórych funkcji, aby przechowywać mniej danych i dublować je w czasie wykonywania.
Jednak w przypadku szczególnie przemierzających kręgów - w celu ich rasteryzacji lub przesunięcia czegoś wzdłuż jednego, można zastosować odmianę algorytmu liniowego Bresenhama . Rzeczywisty algorytm Bresenhama jest oczywiście przydatny również w przypadku tanich linii, które nie są w ośmiu „pierwotnych” kierunkach.
źródło
Istnieje odmiana algorytmu Bresenhama autorstwa Jamesa Fritha , która powinna być jeszcze szybsza, ponieważ całkowicie eliminuje mnożenie. Aby to osiągnąć, nie potrzebuje żadnej tabeli przeglądowej, chociaż można przechowywać wyniki w tabeli, jeśli promień pozostaje stały. Ponieważ algorytm Bresenhama i Fritha używa 8-krotnej symetrii, ta tabela przeglądowa byłaby stosunkowo krótka.
źródło
xoff++ + xoff
i--yoff + yoff
. Twoja lista zmian to naprawi, zastanów się nad ustaleniem go na miejscu zamiast jako notatką. (Zobacz przykłady w sekcji 5 ust. 4 standardu C ++ oraz standardese, który wyraźnie to woła)balance += xoff++ + xoff
ibalance -= --yoff + yoff
. Pozostawiłem to bez zmian, ponieważ tak pierwotnie napisano algorytm Fritha, a poprawkę później sam dodał (patrz tutaj ). Naprawiono teraz.Możesz także użyć przybliżonej wersji funkcji wyzwalacza za pomocą Taylor Expansions http://en.wikipedia.org/wiki/Taylor_series
Na przykład, możesz uzyskać rozsądne przybliżenie sinusu, używając jego pierwszych czterech terminów z serii Taylor
źródło
Jednym z niesamowitych algorytmów do równomiernego podróżowania po okręgu jest algorytm Goertzela . Wymaga tylko 2 zwielokrotnień i 2 dodatków na krok, bez tablicy odnośników i bardzo minimalnego stanu (4 liczby).
Najpierw zdefiniuj niektóre stałe, być może zakodowane na stałe, w oparciu o wymagany rozmiar kroku (w tym przypadku 2π / 64):
Algorytm wykorzystuje 4 liczby jako swój stan, zainicjowany w następujący sposób:
I wreszcie główna pętla:
Może wtedy trwać wiecznie. Oto pierwsze 50 punktów:
Algorytm może oczywiście działać na sprzęcie o stałym punkcie. Wyraźną wygraną z Bresenhamem jest stała prędkość nad kołem.
źródło