Buchempfehlung
Windows-Programmierung. Das Entwicklerhandbuch zur WIN32-API
Windows-Programmierung. Das Entwicklerhandbuch zur WIN32-API
"Der" Petzold, das über 1000 Seiten starke Standardwerk zum Win32-API - besonders nützlich u. a. bei der GUI-Programmierung in FreeBASIC! [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

Tutorial

Winkelmodus und Winkelfunktionen

von RedakteurytwinkySeite 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..

 

Gehe zu Seite Gehe zu Seite  1  2  
Zusätzliche Informationen und Funktionen
  • Das Tutorial wurde am 14.06.2007 von Redakteurytwinky angelegt.
  • Die aktuellste Version wurde am 28.12.2007 von Redakteurytwinky gespeichert.
  Bearbeiten Bearbeiten  

  Versionen Versionen