Ich dachte an Plattformen und Feinde, die sich in alten 2D-Spielen im Kreis bewegten, und fragte mich, wie das gemacht wurde. Ich verstehe parametrische Gleichungen und es ist trivial, sin und cos zu verwenden, aber könnte ein NES oder SNES Echtzeit-Trigger-Aufrufe ausführen? Ich gebe schwere Unwissenheit zu, aber ich dachte, das wären teure Operationen. Gibt es eine clevere Möglichkeit, diese Bewegung billiger zu berechnen?
Ich habe daran gearbeitet, einen Algorithmus aus Triggersummenidentitäten abzuleiten, der nur vorberechnete Trigger verwendet, der jedoch kompliziert zu sein scheint.
Antworten:
Auf Hardware, wie Sie sie beschreiben, besteht eine übliche Lösung für den allgemeinen Fall darin, einfach eine Nachschlagetabelle für die Trigonometriefunktionen zu erstellen, an denen Sie interessiert waren, manchmal in Verbindung mit Festpunktdarstellungen für Werte.
Das potenzielle Problem bei dieser Technik besteht darin, dass sie Speicherplatz beansprucht. Sie können dies jedoch herunterspielen, indem Sie sich für eine niedrigere Auflösung der Daten in Ihrer Tabelle entscheiden oder die periodische Natur einiger Funktionen nutzen, um weniger Daten zu speichern und zur Laufzeit zu spiegeln.
Für das spezifische Durchlaufen von Kreisen - entweder um sie zu rastern oder um etwas entlang eines zu bewegen - kann jedoch eine Variation des Bresenham-Linienalgorithmus verwendet werden . Der eigentliche Algorithmus von Bresenham ist natürlich auch nützlich, um Linien, die nicht in den acht "primären" Richtungen liegen, recht billig zu durchqueren.
quelle
Es gibt eine Variation von Bresenhams Algorithmus von James Frith , die noch schneller sein sollte, da sie die Multiplikation vollständig eliminiert. Es braucht keine Nachschlagetabelle, um dies zu erreichen, obwohl man die Ergebnisse in einer Tabelle speichern könnte, wenn der Radius konstant bleibt. Da sowohl der Bresenham- als auch der Frith-Algorithmus eine 8-fache Symmetrie verwenden, wäre diese Nachschlagetabelle relativ kurz.
quelle
xoff++ + xoff
und--yoff + yoff
. Ihre Änderungsliste wird dies beheben. Ziehen Sie in Betracht, sie an Ort und Stelle zu reparieren, anstatt sie als Hinweis zu verwenden. (Siehe Abschnitt 5 Absatz 4 des C ++ - Standards für Beispiele und den Standard, der dies ausdrücklichbalance += xoff++ + xoff
undbalance -= --yoff + yoff
. Ich habe dies unverändert gelassen, da Friths Algorithmus ursprünglich so geschrieben wurde und der Fix später von ihm selbst hinzugefügt wurde (siehe hier ). Jetzt behoben.Sie können auch eine ungefähre Version der Triggerfunktionen mithilfe von Taylor Expansions http://en.wikipedia.org/wiki/Taylor_series verwenden
Zum Beispiel können Sie eine vernünftige Annäherung an den Sinus verwenden, indem Sie die ersten vier Begriffe der Taylorreihe verwenden
quelle
Ein großartiger Algorithmus, um gleichmäßig über einen Kreis zu fahren, ist der Goertzel-Algorithmus . Es sind nur 2 Multiplikationen und 2 Additionen pro Schritt, keine Nachschlagetabelle und ein sehr minimaler Zustand (4 Zahlen) erforderlich.
Definieren Sie zunächst einige Konstanten, möglicherweise fest codiert, basierend auf der erforderlichen Schrittgröße (in diesem Fall 2π / 64):
Der Algorithmus verwendet 4 Zahlen als Status, die wie folgt initialisiert wurden:
Und zum Schluss die Hauptschleife:
Es kann dann für immer gehen. Hier sind die ersten 50 Punkte:
Der Algorithmus kann natürlich auf Festkomma-Hardware arbeiten. Der klare Sieg gegen Bresenham ist die konstante Geschwindigkeit über den Kreis.
quelle