Arctanxy

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 . Dog tildeles origo, altså punktet med koordinaterne , ikke nogen retningsvinkel. Figuren illustrerer sammenhængen mellem og .
Problematik
Kender man et punkts afstand fra origo og dets retningsvinkel (altså punktets polære koordinater , kan man let beregnet punktets kartesiske koordinater :
Til beregning den omvendte vej fra til er den matematiske funktion utilstrækkelig, da den ikke kan skelne mellem to mulige retningsvinkler, eller . For at løse dette problen er det nødvendigt at benytte en funktion med to argumenter, nemlig koordinaterne og . 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, , med parameterrækkefølgen , således at
- for positive .
hvor er Fortrans betegnelse for . Parameterrækkefølgen er her valgt at følge brøkskrivemåden , men er den modsatte af standardkoordinatrækkefølgen . Nedenstående given en oversigt over, hvilken software, der anvender hvilken konvention.
arctan2(y,x)
- Fortran.
- Programmeringssproget C benytter konventionen .
- I Common Lisp skrives .[2]
arctan2(x,y)
- Microsoft Excel,[3] OpenOffice.org Calc og Google Spreadsheets,[4] benytter -konventionen. I dansk Excel er celleformlen
=arctan2(x_koordinat,y_koordinat). - I Mathematica anvendes formen . Mathematica klassificerer som et ubestemt udtryk.
- I de fleste grafiske lommeregnere fra Texas Instruments er det tilsvarende kald R►Pθ og argumentrækkefølgen er .
arctanxy
Ved dette valg af navngivning er der ikke tvivl om argumentrækkefølgen, kaldet er .
Implementation af arctanxy
Programmeringssprog, som indeholder en -funktion kan let konstruere . Herunder vises en implementation af i programmeringssproget Visual Basic, hvor retningsvinklen leveres i radianer i intervallet :
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 :
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