Genauer Abstand zwischen zwei Winkeln

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

ToeB

Betreff: Genauer Abstand zwischen zwei Winkeln

BeitragDo, Okt 22, 2009 18:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier mal ne kleine Funktion die den genauen Abstand zwischen zwei winkeln berechnet. Was ich mit Genau meine ? Nämlich die +/- abstände. Stellt euch mal vor winkel 1 ist 315° und winkel2 ist 45° (logischerweise würde man hier über null rechnen, also 90°. Wenn man aber winkel2-winkel1 rechnet, hat man -225°. Ist zwar richtig aber nicht brauchbar wenn man Object1 zu Object zwei drehen möchte. Also benutz man diese Function hier :

Code: [AUSKLAPPEN]
Function Absw#(w1#,w2#)
   w1 = win(w1)
   w2 = win(w2)
   w4# = win(w1+180)
   If (w2 < 180 And w1 < 180) Or (w2 => 180 And w1 =>180) Then
      w3 = w2-w1
   ElseIf (w2 < 180 And w1 => 180)
      If w4 > w2 Then
         w3 = 360 - (w1-w2)
      Else
         w3 = -(w1-w2)
      EndIf
   ElseIf (w2 => 180 And w1 < 180)
      If w4 < w2 Then
         w3 = 360 - (w1-w2)
      Else
         w3 = -(w1-w2)
      EndIf
   EndIf
   Return w3
End Function 

Function win#(w#)
   If w < 0 w = 360 + w
   If w > 360 w = w - 360
   Return w
End Function


Sry hatte ich vergessen Embarassed

Und schon kann man den richtigen abstand ermitteln Very Happy

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!
  • Zuletzt bearbeitet von ToeB am Do, Okt 22, 2009 19:00, insgesamt 2-mal bearbeitet

Xeres

Moderator

BeitragDo, Okt 22, 2009 18:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Uhm... was ist die Funktion win?
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)

Holzchopf

Meisterpacker

BeitragDo, Okt 22, 2009 19:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Absw(30,330) hat Folgendes geschrieben:
660

ToeB, so kann man das leider nicht gebrauchen, mach es bitte noch lauffähig.

Ich kann nicht ganz nachvollziehen, ob die Funktion nun eine Drehsinnunterscheidung machen soll oder nicht. Wenn nicht, tut's auch einfach dieses hier:
BlitzBasic: [AUSKLAPPEN]
Function Absw#(w1#,w2#) 
w1=w1 Mod 360
w2=w2 Mod 360
Local wd#=Abs(w1-w2)
Return 180-Abs(wd-180)
End Function


mfG
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm
  • Zuletzt bearbeitet von Holzchopf am Do, Okt 22, 2009 19:13, insgesamt einmal bearbeitet

Noobody

BeitragDo, Okt 22, 2009 19:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Nevermind, verlesen Razz
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

Der Eisvogel

BeitragDo, Okt 22, 2009 21:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Holzchopf, dass hast du aber sehr Sanft ausgedrückt. Wink
Du hast mir meinen Zug versaut, das wollte ich auch schreiben. Also, siehe meine Signatur.
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

mpmxyz

BeitragDo, Okt 22, 2009 23:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie wäre es mit dem hier:
Code: [AUSKLAPPEN]
Abstand=Abs((540+(w2-w1)Mod 360)Mod 360-180)

Da ist ein "Abs" weniger drin... Wink

mfG
mpmxyz
Edit: Da hatte sich gestern abend ein kleiner Rechenfehler eingeschlichen... Embarassed
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer
  • Zuletzt bearbeitet von mpmxyz am Fr, Okt 23, 2009 10:42, insgesamt einmal bearbeitet

aMul

Sieger des Minimalist Compo 01/13

BeitragDo, Okt 22, 2009 23:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn wir schon dabei sind. Ich benutzte folgende Funktion:
Code: [AUSKLAPPEN]
Function ADif#(a1#, a2#)
   a1 = (a2 Mod 360) - (a1 Mod 360)
   If a1 > 180
      Return a1 - 360
   ElseIf a1 < -180
      Return a1 + 360
   EndIf
   Return a1
End Function


Die ist übrigens (zumindest in meinen Tests) nicht nur schneller, sondern funktioniert auch vernünftig.
Zumindest denke ich, dass die Funktion mit den Parametern (30, 330) -60 ausgeben sollte, da man sich schließlich hierbei im Uhrzeigersinn dreht.
Holzchopfs Version gibt hier allerdings 60 zurück.
Für (-330, 60) wird dann allerdings -30 zurückgegeben, obwohl es hier ganz klar gegen den Uhrzeigersinn geht(-330° = 30°).
Und nein, Holzchopf hat nicht nur das Vorzeichen vertauscht, ansonsten würde bei (30, 60) ja nicht (korrekterweise) 30 ausgegeben werden.

EDIT:

@mpmxyz:
Die Zeile hat tatsächlich weniger Funktionsaufrufe. Das nützt ihr allerdings wenig, da die Ergebnisse die sie liefert nicht korrekt sind(von 0 zu 0 sind es sicherlich NICHT 60 Grad).
Panic Pong - ultimate action mashup of Pong and Breakout <= aktives Spiele-Projekt, Downloads mit vielen bunten Farben!
advASCIIdraw - the advanced ASCII art program <= aktives nicht-Spiele-Projekt, must-have für ASCII/roguelike/dungeon-crawler fans!
Alter BB-Kram: ThroughTheAsteroidBelt - mit Quelltext! | RGB-Palette in 32²-Textur / Farbige Beleuchtung mit Dot3 | Stereoskopie in Blitz3D | Teleport-Animation Screensaver

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group