Hello, Guest the thread was called198 times and contains 5 replays

last post from Endurion at the

Bewegung innerhalb eines Kreisbereichs

  • Moin,


    brauche mal euer Schwarmwissen.


    Ziel ist es, dass ich ein Sprite in einem kreisförmigen Bereich relativ frei bewegen kann. Dabei habe ich einen bestimmten Fixpunkt/Mittelpunkt. Mit Joystick hoch/runter bewegt sich der Sprite auf den Mittelpunkt zu bzw. von ihm weg. Mit Joystick links/recht, soll sich der Sprite kreisförmig um den Mittelpunkt drehen.


    Folgende herangehensweise verfolge ich derzeit:

    - Der Mittelpunkt (Start x/y-Koordinate) ist fix

    - Den maximalen Kreisumfang habe ich vorher mittels Bresenham berechnet. Diese Koordinaten habe ich im Speicher. Durch Joystick links/recht fahre ich also gedanklich auf diesem Kreis entlang (Ziel x/y-Koordinate).

    - Nun ziehe ich mittels dieser Bresenham-Routine eine Linie beginnend ab dem Startpunkt bis zum Zielpunkt. Diese Werte speichere ich Schrift für Schritt ab, so dass ich am Ende die x/y-Koordinaten für diese Linie im Speicher habe.

    - Nun habe ich einen Radiuswert (den ich per Joystick hoch/runter verkleinere/vergrößere). Ist der Wert beispielsweise 15, greife ich also jeweils den 15. Wert der erstellten Linie ab.

    - Wenn ich den Joystick nach links/rechts bewege, verändern sich die Ziel-Koordinaten kreisförmig. Die Linie wird dann dann mit den neuen Koordinaten in den Speicher geschrieben. Meinem Verständnis nach, müsste sich dann ein Kreis ergeben, solange ich den Radiuswert nicht verändere.


    Tatsächlich ergibt sich aber ein Quadrat. Wo ist mein Denkfehler? Lässt sich die Bresenham-Linienroutine anpassen, dass sich damit ein Kreis bilden lässt? Vielleicht hat ja wer einen Tipp.


    Gruß

    Courage

  • Die Linienabschnitte sind vermutlich nicht fuer jeden Datenpunkt gleich lang. Also sqrt(dx**2+dy**2) nicht konstant.

    Jup genau, Wenn ich waagerecht 15 Schritte nach links gehe, dann is es am Ende die gleich X-Koordinate wie wenn ich bei einem 45 Grad-Winkel 15 Schritte nach links UND 15 nach unten gehe. Logisch, dass dann ein Quadrat rauskommt. :rolleyes: Schade, hätte ja klappen können. Muss ich wohl mal über einen anderen Ansatz grübeln.

  • Versuchs doch mal mit Polarkoordinaten. Das Wertepaar besteht aus genau den Angaben, die Du vorgibst: 1.) Entfernung (Radius) vom Kreismittelpunkt, 2.) Winkel. Die Umrechnung von Polarkoordinaten in "normale" (= kartesische) X/Y-Koordinaten erscheint zuerst schwierig, weil man dafür Sinus und Cosinus verwenden muß. Dafür läßt sich aber leicht eine Tabelle anlegen. Am besten unterteilst Du Deinen Kreis in 256 Grad (und nicht 360), so daß Du für jeden Quadranten 64 Werte hast, was ausreichen sollte. Die Rechnung wäre dann für X

    X := cosinus(Winkel) * Radius

    und y

    Y := sinus(Winkel) * Radius

    Cosinus kann man leicht in Sinus überführen, so daß man dafür keine Extratabelle anfertigen muß. Einzig die Multiplikation wäre etwas aufwendig, aber bei 8 * 8 wäre das jetzt auch nicht so schlimm.

    Hinweis: Mit ein wenig mehr Aufwand kann man auch eine Tabelle mit 256 Einträgen anfertigen, in der das Vorzeichen nicht enthalten ist, sondern durch die Gradangabe bestimmt wird. Damit erreicht man dann sogar 1024 Gradeinheiten für eine volle Umdrehung bei nahezu gleichem Platzbedarf im Speicher.

  • Halbwegs getrickst geht auch ohne Tabelle. Du fängst an einem Randpunkt ganz oben, unten, links oder rechts an und arbeitest dann mit Deltas.


    Beispiel ganz unten:


    DX = 4, DY = 0


    nach rechts bedeutet DX -1 und DY -1. Solange, bis X wieder 0 ist, dann bist du ganz oben. In der linken Hälfte ist es dann DX + 1, DY + 1.