Seite 1 von 1

Aus X- und Y-Differenzen Winkel berechnen

Verfasst: 22.03.2007 17:08
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Î

Verfasst: 22.03.2007 19:34
von AndyX
Cool, sowas hab ich schon gesucht, danke :allright:

Verfasst: 22.03.2007 19:40
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]

Verfasst: 23.03.2007 21:13
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

Verfasst: 26.03.2007 01:12
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

Verfasst: 26.03.2007 21:11
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). /:->