Aus X- und Y-Differenzen Winkel berechnen

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Olaf
Beiträge: 117
Registriert: 20.04.2006 14:51
Wohnort: 66606 St.Wendel (Niederlinxweiler, Dr.Albert-Schweitzer-Str.9)
Kontaktdaten:

Aus X- und Y-Differenzen Winkel berechnen

Beitrag von Olaf »

Hier mal ne kleine Prozedur zum berechnen eines Winkels aus gegebenen Differenzen in X- und Y-Richtung.
(quasi aus der Steigung nochmal nen Winkel machen)
Der Code is nicht besonders anspruchsvoll, hat mir aber schon ne Menge Arbeit abgenommen :lol:

Code: Alles auswählen

#Angle_Radian=0
#Angle_Grad=1

Procedure.d GetAngle(dx.d,dy.d,Flags.l)
	Angle.d=ATan(dy/dx)
	If dy<0 And dx<0
		Angle+#PI
	ElseIf dx<0 And dy>=0
		Angle+#PI
	ElseIf dy<0 And dx>=0
		Angle+2*#PI
	EndIf
	If Angle>2*#PI
		Angle-2*#PI
	EndIf
	If Flags=#Angle_Grad ;falls Ausgabe in Grad gewünscht, umrechnen
		Angle=Angle/#PI*180
	EndIf
	ProcedureReturn Angle
EndProcedure

;Beispiel:
Debug GetAngle( 1,1,#Angle_Grad) ;Sollte  45 Grad ergeben:Steigungsdreieck: 1-> ; 1Î
Debug GetAngle(-1,1,#Angle_Grad) ;Sollte 135 Grad ergeben:Steigungsdreieck: 1<- ; 1Î
PB 4.xx (Windows & Linux & Mac OS X)
Treffen sich 2 Kurven in der Unendlichkeit. Sagt die eine zur anderen: "Hau ab aus meinem Definitionsbereich oder ich leite dich ab!"
Darauf die andere: "Mach nur! Ich bin die e-Funktion." :lol:
Benutzeravatar
AndyX
Beiträge: 1272
Registriert: 17.12.2004 20:10
Wohnort: Niederösterreich
Kontaktdaten:

Beitrag von AndyX »

Cool, sowas hab ich schon gesucht, danke :allright:
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

[ON: Offtopic/Witz]
Olaf hat geschrieben:Treffen sich 2 Kurven in der Unendlichkeit. Sagt die eine zur anderen: "Hau ab aus meinem Definitionsbereich, oder ich leite dich ab!"
Darauf die andere: "Mach nur! Ich bin die e-Funktion."
In einer kleinen Kneipe hängen die Funktionen ab.

Gegen Zehn gibt es einen Aufruhr: "Die Ableitungen kommen"
und die ganzen Funktionen fliehen und verstecken sich, bis auf eine.

Als die Ableitungen hereinkommen, blicken sie sich um, die Kneipe ist leer wie es sich gehört,
nur in einer Ecke sitzt noch eine kleine Funktion.

Die Ableitungen schauen sich erbost an, und eine von ihnen sagt: "Ich mach das schon"

Sie tritt an den Tisch in der Ecke und fragt: "Was machst du noch hier?"

Die Funktion grinst sie an: "Ich bin e hoch x"

Die Ableitung antwortet ebenfalls grinsend: "Und ich bin DX nach DZ"

[OFF: Offtopic/Witz]
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Olaf
Beiträge: 117
Registriert: 20.04.2006 14:51
Wohnort: 66606 St.Wendel (Niederlinxweiler, Dr.Albert-Schweitzer-Str.9)
Kontaktdaten:

Beitrag von Olaf »

So mal 'n bisschen komfortabler gemacht: Flag ist jetzt optional, da #Angle_Radian als Standard festgelegt ist.
Und Radiant deswegen, weil alle Trigonometrischen Funktionen mit Radiant und nicht mit Grad arbeiten.

Code: Alles auswählen

#Angle_Radian=0
#Angle_Grad=1

Procedure.d GetAngle(dx.d,dy.d,Flags.l=#Angle_Radian)
   Angle.d=ATan(dy/dx)
   If dy<0 And dx<0
      Angle+#PI
   ElseIf dx<0 And dy>=0
      Angle+#PI
   ElseIf dy<0 And dx>=0
      Angle+2*#PI
   EndIf
   If Angle>2*#PI
      Angle-2*#PI
   EndIf
   If Flags=#Angle_Grad ;falls Ausgabe in Grad gewünscht, umrechnen
      Angle=Angle/#PI*180
   EndIf
   ProcedureReturn Angle
EndProcedure

;Beispiel:
Debug GetAngle( 1,1,#Angle_Grad) ;Sollte  45 Grad ergeben:Steigungsdreieck: 1-> ; 1Î
Debug GetAngle(-1,1,#Angle_Grad) ;Sollte 135 Grad ergeben:Steigungsdreieck: 1<- ; 1Î
Debug GetAngle( 0,1) ;Flag wird ja nicht benötigt bei Angaben in Radiant: Sollte 1.570796...ergeben
PB 4.xx (Windows & Linux & Mac OS X)
Treffen sich 2 Kurven in der Unendlichkeit. Sagt die eine zur anderen: "Hau ab aus meinem Definitionsbereich oder ich leite dich ab!"
Darauf die andere: "Mach nur! Ich bin die e-Funktion." :lol:
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

Kleiner Tip noch :

Du solltest vor arctan() prüfen ob dx = 0 ist, denn sonst rechent er durch 0. Das programm stürzt ja nciht ab, abe es kommen falsche Werte raus.

Hier mal meine Variante:

Code: Alles auswählen

#b = 0.01745329
Procedure.f Winkel(x,y)
 Winkel.f
 If x = 0
  If y <  0 : Winkel = -90 : EndIf 
  If y >= 0 : Winkel =  90 : EndIf 
 Else 
  Winkel = ATan(y/x)/#b 
  If x < 0 : Winkel + 180 : EndIf 
 EndIf 
 ProcedureReturn Winkel
EndProcedure
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Olaf
Beiträge: 117
Registriert: 20.04.2006 14:51
Wohnort: 66606 St.Wendel (Niederlinxweiler, Dr.Albert-Schweitzer-Str.9)
Kontaktdaten:

Beitrag von Olaf »

@STARGÅTE:
Ja stimmt natürlich...hab ich garned dran gedacht (in meinen Progs hab ich das immer vor Prozeduraufruf prüfen lassen). /:->
PB 4.xx (Windows & Linux & Mac OS X)
Treffen sich 2 Kurven in der Unendlichkeit. Sagt die eine zur anderen: "Hau ab aus meinem Definitionsbereich oder ich leite dich ab!"
Darauf die andere: "Mach nur! Ich bin die e-Funktion." :lol:
Antworten