Elegantere Lösung für Winkelberechnung

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Hubsi

Betreff: Elegantere Lösung für Winkelberechnung

BeitragDo, Okt 25, 2012 17:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Hai beisammen.

Ich habe einen realen Winkel als Integer gegeben und suche nun den nächstliegenden 45°-Schritt dazu. Ich habe auch eine funktionierende Lösung dafür geschrieben, aber mich stört etwas der "unhandliche" und wenig ästhetisch wirkende Code.

BlitzBasic: [AUSKLAPPEN]
tmp_int=(ATan2(ball_y-p\y,ball_x-p\x)+360) Mod 360 ; Winkel real
Select True
Case tmp_int>=337 Or tmp_int<=22
p\dest_angle=0
Case tmp_int>=23 And tmp_int<=67
p\dest_angle=45
Case tmp_int>=68 And tmp_int<=112
p\dest_angle=90
Case tmp_int>=113 And tmp_int<=157
p\dest_angle=135
Case tmp_int>=158 And tmp_int<=202
p\dest_angle=180
Case tmp_int>=203 And tmp_int<=247
p\dest_angle=225
Case tmp_int>=248 And tmp_int<=292
p\dest_angle=270
Case tmp_int>=293 And tmp_int<=337
p\dest_angle=315
End Select

Ein wüstes Select...Case-Konstrukt wie Ihr seht, aber mir fällt nichts ein wie ich das schön mathematisch runterbrechen könnte. Hat da vielleicht jemand eine Idee für mich?
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

BlitzMoritz

BeitragDo, Okt 25, 2012 17:22
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzMax: [AUSKLAPPEN]
For angle:Int = 0 To 360
Print "angle = " + angle + " genormt auf " + NormAngle(angle, 45)
Next

Function NormAngle:Int(Angle:Int, Part:Int)
Return ((Angle+Part/2) / Part) * Part
End Function

Beachte: ... schreibt man 0.5*Part statt Part/2, klappt's nicht Wink
 

PhillipK

BeitragDo, Okt 25, 2012 18:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Interessant oO
Genau das selbe hatte ich die tage auch irgendwo versucht, aber immer mit 0.5*wert.
Gibt es einen besonderen grund, warum sich das scheinbar gleiche * 1/2 bzw /2 anders verhalten? Wird das eventuell anders gerundet?

BlitzMoritz

BeitragDo, Okt 25, 2012 18:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Klar: Die Integer-Variable Part bleibt ein Integer, wenn man sie durch die "Integer 2" teilt. Wenn man sie jedoch mit einem Float multipliziert wie 0.5, mutiert der Term insgesamt zu einem Float und rechnet ab da an "genau" (und verliert dabei den hier gewollten Rundungseffekt). Übrigens würde das Gleiche auch passieren, wenn man durch 2.0 anstatt durch 2 dividiert.

Hubsi

BeitragDo, Okt 25, 2012 19:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen lieben Dank Very Happy Das sieht doch schon ganz anders aus.
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group