Tutorial
Winkelmodus und Winkelfunktionen
von ytwinky | Seite 2 von 2 |
Umkehr- oder Arcus-Funktionen
Wenn ich aus einer gegebenen Zahl(die ja einem Seitenverhältnis entspricht) einen Winkel ermitteln will, benötige ich eine Umkehrfunktion, auch Arcus-Funktion genannt. Eine haben wir bereits kennengelernt, den ArcusTangens ATN(). Nebenbei bemerkt war dies die einzige Arcus-Funktion von Turbo-Pascal. Warum? Weil alle anderen Arcus-Funktionen sich damit darstellen lassen..
..da FreeBASIC uns diese Arbeit jedoch abnimmt, reicht es mir, an dieser Stelle darauf hinzuweisen, daß Interessierte in der mathematischen Literatur genügend Material finden. Mir reicht es, wenn ich meine Bartsch-Formelsammlung in greifbarer Nähe habe(d.h. max. 1m).
ASIN, ACOS, ATN sind in der Befehlsreferenz zu FreeBASIC schon beschrieben, deshalb gehe ich nicht näher darauf ein, genausowenig, wie auf ATAN2(), das eine leistungsfähigere Version von ATN() ist.
Da ich oben bereits die Funktion Cotangens erwähnt habe, in FreeBASIC aber die entsprechende Arcus-Funktion fehlt, sehen wir sie exemplarisch einfach mal an.
Bartsch schreibt dazu:
arccot x= arctan 1/x für x>0
= arctan 1/x + Pi für x<0
(allgemeingültig)
Na, das ist doch ein Angebot, daraus machen wir doch sofort eine Function:
#define Real Double
Declare Function ACot(byVal Wert As Real) As Real
Function ACot(byVal Wert As Real) As Real
Select Case x
Case Is >0
Return Atn(1.0/x)
Case Is <0
Return Atn(1.0/x)+4*Atn(1) '4*Atn(1)=Pi, haben wir ja oben schon benutzt..
Case Else 'jetzt kann nur noch x=0 sein, darüber hat Herr Bartsch geschwiegen..
End Select
End Function
Hat Bartsch uns etwas verschwiegen? Was ist denn, wenn x=0 ist? Nun, die o.a. Formeln darf ich nicht benutzen, wenn x=0 ist, weil dort durch x geteilt wird. Also nachdenken(das ist für manchen gewiß ein schmerzhafter Prozeß, da hilft aber alles nichts, anders kommen wir hier nicht weiter..)
.. <= Denkpause
Wenn also der Eingangswert für ArcCot=0 ist, dann muß es doch auch einen Winkel geben, der als Cot 0 ergibt, oder?
Cot=1/Tan liefert einen Wert, der verdammt nah' an der 0 ist, wenn es um einen Rechten Winkel geht..
..und wenn das einer der Hauptwerte ist, für die Bartsch die Formel
arccot x = Pi/2 -arctan x
vorgesehen hat?
#define Real Double
Declare Function ACot(byVal Wert As Real) As Real
Function ACot(byVal Wert As Real) As Real
Static As Real a=Atn(1.0)
If x>0 Then Return Atn(1.0/x)
If x<0 Then Return 4.0*a+Atn(1.0/x) '4.0*Atn(1.0)=Pi, haben wir ja oben schon benutzt..
Return 2.0*a-Atn(x) 'also könnte der Winkel einer der Hauptwerte sein..
End Function
Eleganter formuliert sähe das so aus:
#define Real Double
Declare Function ACot(byVal Wert As Real) As Real
Function ACot(byVal Wert As Real) As Real
Static As Real a=Atn(1.0) 'wird nur beim 1. Aufruf berechnet und bleibt erhalten
Select Case x 'ist der Schalter für die Auswahl
Case Is >0
Return Atn(1.0/x)
Case Is <0
Return 4.0*a+Atn(1.0/x) '4*Atn(1.0)=Pi, haben wir ja oben schon benutzt..
Case Else
Return 2.0*a-Atn(x) 'also könnte der Winkel einer der Hauptwerte sein..
End Select
End Function
..bingo, das war's oder einfach kompakt:
#define Real Double
Declare Function ACot(byVal Wert As Real) As Real
Function ACot(byVal x As Real) As Real
Static As Real a=Atn(1.0) 'wird nur beim 1. Aufruf berechnet und bleibt erhalten
Return IIF(x>0, Atn(1.0/x), IIF(x<0, 4.0*a+Atn(1.0/x), 2.0*a-Atn(x))) '..und wieder ein Beispiel für IIF()
End Function
Noch eine Anmerkung zur Schreibweise von Zahlen: Konstante Faktoren werden üblicherweise als Integer Zahlen geschrieben z.B. 4*Atn(1).
(gut 1 ist hier kein Faktor, das lassen wir aber mal unberücksichtigt)
Damit nun optisch auch klar ersichtlich ist, daß diese Zahlen aber in Wirklichkeit als Fließkommazahlen zu behandeln sind, schreibe ich lieber 4.0*Atn(1.0), um diesen Sachverhalt auch zu dokumentieren. Dem Compiler ist es egal, da er diese Zahlen sowieso nach seinen Regeln behandelt, aber für einen Fremden ist sofort ersichtlich, daß hier etwas Besonderes gemeint ist.
So, damit wäre das Thema Winkel ersteinmal abgehandelt, sollte es Fragen geben(was ich mir überhaupt nicht vorstellen kann), nur zu, denn Fragen sind dazu da, um gestellt zu werden..
Zusätzliche Informationen und Funktionen | |||||||
---|---|---|---|---|---|---|---|
|