Rubrik: Variablen/Strings · Algorithmen/Mathematik | VB-Versionen: VB5, VB6 | 07.03.01 |
Cartesian2Polar Quadrantenrichtige Umwandlung von kartesischen Koordinaten in Polar-Koordinaten | ||
Autor: Helmut Suhren | Bewertung: | Views: 20.904 |
ohne Homepage | System: Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Unser heutige Tipp stellt ein Algorithmus vor, mit welchem sich kartesische Koordinaten-Angaben in Polar-Koordinaten umwandeln lassen.
Hierzu wird die Funktion atan2 benötigt, welche im Gegensatz zu manch anderen Programmiersprachen nicht Bestandteil von Visual-Basic ist. Der Standard-Funktion "atan" wird bekanntlich nur der Quotient (x/y) übergeben, wobei dann keine Unterscheidung mehr möglich ist, ob z.B. x oder y negativ ist. Dadurch daß in der Funktion atan2 beide Werte (x und y) separat übergeben werden, ist diese Unterscheidung möglich.
' Umwandlung kartesische Koordinaten in Polar-Koordinaten Public Sub Cartesian2Polar(dx As Double, dy As Double, _ r As Double, b As Double) r = Sqr(dx ^ 2 + dy ^ 2) b = atan2d(dx, dy) End Sub ' Quadrantenrichtige Arcustangens-Funktion in Degrees Public Function atan2d(dx As Double, dy As Double, _ Optional positive_only As Boolean = True) As Double atan2d = atan2(dx, dy, positive_only) * 45 / Atn(1) End Function ' Quadrantenrichtige Arcustangens-Funktion in rad Public Function atan2(dx As Double, dy As Double, _ Optional positive_only As Boolean = True) As Double Dim PI As Double Dim PI_2 As Double PI = Atn(1) * 4 ' PI PI_2 = Atn(1) * 2 ' PI/2 Select Case True Case Abs(dx) < 0.0000001 ' -pi(-180°) / 0(0°) atan2 = IIf(dy < 0#, -Pi, 0#) Case Abs(dy) < 0.0000001 ' -pi/2(-90°) / +pi/2(+90°) atan2 = IIf(dx < 0#, -PI_2, PI_2) Case Else atan2 = Atn(dx / dy) atan2 = atan2 + IIf(atan2 < 0#, IIf(dy < 0#, _ PI, 0#), IIf(dx < 0#, -PI, 0#)) End Select If positive_only And (atan2 < 0) Then _ atan2 = atan2 + 2 * Pi End Function
Erweiterung vom 19.02.09:
' Umrechnung von Polar- in kartesische Koordinaten Public Sub Polar2Cartesian(ByVal R As Double, ByVal b As Double, _ x As Double, y As Double) x = Sin(b * Atn(1) / 45) * R y = Cos(b * Atn(1) / 45) * R End Sub