Arctanxy

Fra testwiki
Spring til navigation Spring til søgning
Et punkt i planet, som ikke ligger i origo, har de rektangulære koordinater (x,y) og punktets retningsvinkel er θ.

Funktioner med navne som arctanxy eller arctan2 benyttes i matematik til bestemmelse af retningsvinklen θ (theta) hørende til et givet punkt i planen med kartesiske (rektangulære) koordinater (x,y). Dog tildeles origo, altså punktet med koordinaterne (0,0), ikke nogen retningsvinkel. Figuren illustrerer sammenhængen mellem (x,y) og θ.


Problematik

Kender man et punkts afstand r fra origo (0,0) og dets retningsvinkel θ (altså punktets polære koordinater (r,θ), kan man let beregnet punktets kartesiske koordinater (x,y):

{x=cos(θ)ry=sin(θ)r

Til beregning den omvendte vej fra (x,y) til θ er den matematiske funktion arctan utilstrækkelig, da den ikke kan skelne mellem to mulige retningsvinkler, θ eller θ+180. For at løse dette problen er det nødvendigt at benytte en funktion med to argumenter, nemlig koordinaterne x og y. Men de præsenterede løsninger er uenige om rækkefølgen.

arctan2

I 1961 implementerede programmeringssproget Fortran IV [1]en funktion med to argumenter, atan2, med parameterrækkefølgen (y,x), således at

atan2(y,x)=atan(y/x) for positive x.

hvor atan er Fortrans betegnelse for arctan. Parameterrækkefølgen er her valgt at følge brøkskrivemåden y/x, men er den modsatte af standardkoordinatrækkefølgen (x,y). Nedenstående given en oversigt over, hvilken software, der anvender hvilken konvention.

arctan2(y,x)

arctan2(x,y)

arctanxy

Ved dette valg af navngivning er der ikke tvivl om argumentrækkefølgen, kaldet er arctanxy(x,y).

Implementation af arctanxy

Programmeringssprog, som indeholder en arctan-funktion kan let konstruere arctanxy. Herunder vises en implementation af arctanxy i programmeringssproget Visual Basic, hvor retningsvinklen leveres i radianer i intervallet [0, 2π[:

Public Pi As Double
Public PiQuart As Double
Public PiHalf As Double
Public Pi3half As Double
Public PiTwice As Double
Public mcDegToRad As Double

Sub InitMath()
    PiQuart = Atn(1)
    Pi = 4 * PiQuart
    PiHalf = 2 * PiQuart
    Pi3half = 6 * PiQquart
    PiTwice = 8 * PiQuart
    mcRadToDeg = 45 / PiQuart    ' 1 rad = 180/Pi degrees
End Sub
    
Public Function RadToDeg(x As Double) As Double
    RadToDeg = mcRadToDeg * x
End Function

Function AtnDeg(x As Double) As Double
    AtnDeg = RadToDeg(Atn(x))
End Function

Public Function ArctanXY_0_2pi(x As Double, y As Double) As Double
    Dim xAbs As Double, yAbs As Double, Phi As Double
    xAbs = Abs(x): yAbs = Abs(y)
    Select Case True
        Case x >= yAbs   ' Octants 1 and 8
            Phi = Atn(y / x)
            If y < 0 Then Phi = PiTwice + Phi    ' Octant 8
        Case y >= xAbs   ' Octants 2 and 3
            Phi = PiHalf - Atn(x / y)
        Case -x >= yAbs   ' Octants 4 and 5
            Phi = Pi + Atn(y / x)
        Case -y >= xAbs   ' Octants 6 and 7
            Phi = Pi3half - Atn(x / y)
    End Select
    ArctanXY_0_2pi = Phi
End Function

Ønskes retningsvinklen i grader, kan følgende konstruktion benyttes. På grund af afrundingsfejl i beregningerne må denne version anbefales i stedet for at benytte ovenstående og derefter konvertere vinklen fra radianer til grader. Retningsvinklen leveres i grader i intervallet [0; 360[:

Public Function ArctanXY_0_360(x As Double, y As Double) As Double
    Dim xAbs As Double, yAbs As Double, Phi As Double
    xAbs = Abs(x): yAbs = Abs(y)
    Select Case True
        Case x >= yAbs   ' Octants 1 and 8
            Phi = AtnDeg(y / x)
            If y < 0 Then Phi = 360 + Phi    ' Octant 8
        Case y >= xAbs   ' Octants 2 and 3
            Phi = 90 - AtnDeg(x / y)
        Case -x >= yAbs   ' Octants 4 and 5
            Phi = 180 + AtnDeg(y / x)
        Case -y >= xAbs   ' Octants 6 and 7
            Phi = 270 - AtnDeg(x / y)
    End Select
    ArctanXY_0_360 = Phi
End Function

Referencer

Skabelon:Reflist