fehler mit atan2

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Mathias-Kwiatkowski

Betreff: fehler mit atan2

BeitragSa, Okt 09, 2010 1:44
Antworten mit Zitat
Benutzer-Profile anzeigen
warum habe ich den fehler

objekt is in der mitte platziert, des screens soll sich immer zu maus hin drehen
und wenn ich mit der maus links oben bin steht das objekt links unten, ...

code:
Code: [AUSKLAPPEN]
Function Fps:Int()

Global show:Int, counter:Int = MilliSecs(), count:Int
If MilliSecs()-counter >= 1000 Then
counter = MilliSecs()
show = count
count = 0
End If
count :+ 1
Return show

End Function

Global WaitTime:Int = CreateTimer(100)


Graphics 1024, 768, 1


SetMaskColor 255, 0, 255

Incbin "Ship000.bmp"
Global Ship000:TImage = LoadImage("incbin::Ship000.bmp") MidHandleImage(Ship000)

Repeat
    SetColor 0, 0, 0
    Cls
    SetColor 255, 255, 255
    DrawText Fps(), 0, 0
   
        winkel = 360 - ATan2 (MouseY() - 768 / 2, MouseX() - 1024 / 2)
        SetRotation (winkel)
        DrawImage Ship000, 1024 / 2, 768 / 2
        SetRotation (0)
   
    Flip
    WaitTimer WaitTime
Until KeyDown(KEY_ESCAPE)
End

Lastmayday

BeitragSa, Okt 09, 2010 3:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

das Problem ist simpel: die X Y Achsen sind bei ATan2 vertauscht.
BlitzMax: [AUSKLAPPEN]
winkel = 180 - ATan2 (MouseX() - 1024 / 2, MouseY() - 768 / 2)

( +- 90 je nach zeigerichtung des Schiffes auf dem Bild )

mfg Lastmayday

Xeres

Moderator

BeitragSa, Okt 09, 2010 12:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Ähm... nein...?
Atan2(y, x) ist schon richtig. Die Frage ist - mit welchen Winkeln will man rechnen?
Das gibt den mathematisch korrekten Winkel:
BlitzMax: [AUSKLAPPEN]
winkel = (-ATan2 (MouseY() - 768 / 2, MouseX() - 1024 / 2) + 360) Mod 360


Da bei der Rotation aber die Position im rechten, unteren Quadranten beachtet wird, muss da die Drehrichtung tauschen:
BlitzMax: [AUSKLAPPEN]
SetRotation (-winkel)


Insgesammt:
BlitzMax: [AUSKLAPPEN]
SuperStrict

Function FPS:Int()

Global show:Int, counter:Int = MilliSecs(), count:Int
If MilliSecs()-counter >= 1000 Then
counter = MilliSecs()
show = count
count = 0
End If
count :+ 1
Return show

End Function

Global WaitTime:TTimer = CreateTimer(100)


Graphics 1024, 768


Local winkel:Int
Repeat
SetColor 0, 0, 0
Cls
SetColor 255, 255, 255
DrawText Fps(), 0, 0

winkel = (-ATan2 (MouseY() - 768 / 2, MouseX() - 1024 / 2) + 360) Mod 360
SetRotation (-winkel)
DrawRect 1024 / 2, 768 / 2, 128, 64
DrawRect (1024 / 2) + 250 * Cos(winkel), (768 / 2) - 250 * Sin(winkel), 32, 32
SetRotation (0)

DrawText "winkel: " + winkel, 0, 15

Flip
WaitTimer WaitTime
Until KeyDown(KEY_ESCAPE)
End


- Man kann die Negativen Vorzeichen auch beide Weglassen; es wird einem dann halt die (mathematisch) falschen Winkel angezeigt. Um die Verwirrung komplett zu machen muss man dann mit +sin Statt -sin rechnen...

Und Mathias-Kwiatkowski: Gewöhne dir gleich mindestens Strict oder SuperStrict an - die Programme laufen schneller und du machst weniger Fehler.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group