Atan2 Problem.

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Mathias-Kwiatkowski

Betreff: Atan2 Problem.

BeitragMi, März 21, 2012 4:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Atan2 zeigt mir ja den winkel von -180 und +180 grad an
was is wenn ich nun 8 bilder habe 0 bis 7 und diese möchte ich anzeigen lassen je nachdem welche richtung die maus schaut?

z.b. bild 0 wenn maus rechts 1 wenn unten rechts und 2 wenn unten.

hab schon bissel experementiert, aber das führte bislang nur zum absturts des programms. naja irgendwo auch logisch -180 ^^ ich weiss da momentan kein rat.

danke für eure hilfe im vorfeld.
 

Matthias

BeitragMi, März 21, 2012 11:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Hay.

Du kannst zu deinem Atan2 Winkel einfach 180 dazu rechnen.

360 Crad entsprechen 7 Animbilder.

DrawImage AnimImg,0,0,(360/Float(MaxFrame))*(Atan2(MX,MY)+180)

So ähnlich könnte es functionieren.

BladeRunner

Moderator

BeitragMi, März 21, 2012 15:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab jetzt keine Zeit, werde dir heut abend hier was reineditieren:
Nur soviel vorneweg: 360° entsprechen mitnichten 7 Frames (ich denke mal Matthias meint dass bei seiner Denkweise Frames zwischen 0 und 7 rauskommen), sondern exakt sovielen wie man selbst festlegt. Und 7 wäre, da 360 nicht wirklich durch 7 teilbar ist, eine schlechte Wahl.
In der Regel werden 8 oder 16 Frames verwendet, was Du in deiner Frage hast geht von 8 Frames aus, und dafür werde ich heute abend eine Antwort nachliefern.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Mathias-Kwiatkowski

BeitragMi, März 21, 2012 19:51
Antworten mit Zitat
Benutzer-Profile anzeigen
ich habe 8 frames

0 = auch ein bild
dann halt 1- 7

also insgesammt 8 bilder

Lobby

BeitragMi, März 21, 2012 21:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Also, warum dann nicht einfach so?
BlitzBasic: [AUSKLAPPEN]
Local frame%=(angle+180)*8/360

Wobei angle der mit Atan2 ermittelte Gradwert darstellt, der ja nach deinen Angaben immer zwischen -180 und 180 liegt.
TheoTown - Eine Stadtaufbausimulation für Android, iOS, Windows, Mac OS und Linux

BladeRunner

Moderator

BeitragMi, März 21, 2012 22:37
Antworten mit Zitat
Benutzer-Profile anzeigen
So, jetzt aber:
Wie Matthias schon anmerkte erledigst Du die Probleme mit der -180°-Winkelei durch ein simples aufaddieren von 180 zu deinem Winkel.
Was bedeutet das aber im Klartext? Ganz einfach, Du rotierst dein Ergebnis um 180°, also um einen Halbkreis. Das ist im hier vorliegenden Fall aber vollkommen wurscht, weil Du ja beliebig festlegen kannst welches Frame an welcher Stelle in deiner Grafik steht. Du passt also die Animationsreihenfolge einfach deinen Ergebnissen an Wink
Daher wäre die simpelste Lösung in der Tat:
Framenummer = (Atan2(yDifferenz , xDifferenz)+180)/(360/Animationsschritte)
ABER: Das hat einen kleinen, aber dennoch unschönen Haken. Da ja das Animationsframe durch einfache Division des Winkels durch die Größe eines Einzelschrittes erfolgt, liegen die Grenzen nicht so wie man es erwarten würde.

Beispiel: Bei 8 Richtungen fängt zb. Frame 0 bei 0° an und geht bis 44°. Nehmen wir mal an 0° sind rechts und 44° sind dann schräg oben rechts, dann wird die animation "Laufe gradeaus" für diesen Bereich gezeigt.
Wenn nun der Winkel nah an den 44° ist sollte die Figur aber doch schon die Animation "laufe schräg hoch" benutzen damit es gut aussieht. Ebenso wäre bei 359° schon die Animation "laufe schräg runter dran, obwohl es ja wesentlich näher an geradeaus laufen wäre.

Um das zu beheben kannst Du dir aber zu Nutze machen was wir eingangs festgestellt haben: Durch das aufaddieren einer Zahl zu deinem Winkel rotierst Du die komplette Bewegung.
Du musst also nur einen halben Animationsschritt auf deinen Winkel draufschlagen und schwupps wird immer in der Mite zwischen den Winkeln auf das nächste Frame weitergeschaltet.
Also:
Framenummer = ((Atan2(yDifferenz , xDifferenz)+180+(180/Animationsschritte))Mod 360) /(360/Animationsschritte)

Das Mod 360 ist drin um die Berechnung auf Werte zwischen 0 und 359 zu begrenzen, da sonst falsch hohe Framenummern entstehen könnten.

Hier noch ein Beispiel, in BMax, allerdings sollte es mit kleinsten Änderungen auch in BB laufen.

BlitzMax: [AUSKLAPPEN]
Graphics 640 , 480
Local winkel:Int = 0

Repeat
Cls
SetColor 255,0,0
Plot 320 , 240 'MittelPunkt

DrawText (ATan2(240-MouseY(),320-MouseX())), 0 , 0 'Winkel Mittelpunkt-Maus
DrawText Int( ( (ATan2(240-MouseY(), 320 - MouseX() ) + 202.5)Mod 360) / 45) , 0 , 10 'hier alles hardcodiert, aber das Prinzip sollte klar sein
Plot 320 + Cos(winkel) * 20 , 240 + Sin(winkel) * 20 'Rotationspunkt
DrawText Int( ( (ATan2(-Sin(winkel) * 20 , -Cos(winkel) * 20 ) + 202.5)Mod 360) / 45) , 0 , 20 'angepasstes Frame Rotation.
winkel:+ 1
SetColor 255 , 255 , 255
'noch die Schwellen einzeichnen an denen nun die Frames umspringen:
For Local w:Float = 22.5 To 202.5 Step 45
DrawLine(320 + Cos(w) * 30 , 240 + Sin(w) * 30 , 320 + Cos(w + 180) * 30 , 240 + Sin(w + 180) * 30)
Next

Flip
Until KeyHit(Key_Escape)
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group