Difference between revisions of "LlAtan2"

From Second Life Wiki
Jump to: navigation, search
m
m
Line 8: Line 8:
 
|func_footnote=Similar to the <span class="plainlinks">{{wikipedia|Inverse_trigonometric_functions|arctangent}}</span>({{LSLP|y}}/{{LSLP|x}}) except it utilizes the signs of {{LSLP|x}} & {{LSLP|y}} to determine the quadrant and avoids  division by zero. <br />
 
|func_footnote=Similar to the <span class="plainlinks">{{wikipedia|Inverse_trigonometric_functions|arctangent}}</span>({{LSLP|y}}/{{LSLP|x}}) except it utilizes the signs of {{LSLP|x}} & {{LSLP|y}} to determine the quadrant and avoids  division by zero. <br />
 
|spec=
 
|spec=
If {{LSLP|x}} is zero and...
+
 
 +
[9:10] Object: llAtan2(+0, +0) = 0.000000
 +
[9:10] Object: llAtan2(+0, -0) = 3.141593
 +
[9:10] Object: llAtan2(-0, +0) = 0.000000
 +
[9:10] Object: llAtan2(-0, -0) = -3.141593
 +
 
 +
If {{LSLP|x}} is positive zero and...
 
* {{LSLP|y}} is zero, '''zero''' is returned.
 
* {{LSLP|y}} is zero, '''zero''' is returned.
 
* {{LSLP|y}} is positive, '''PI/2''' is returned.
 
* {{LSLP|y}} is positive, '''PI/2''' is returned.
 
* {{LSLP|y}} is negative, '''-PI/2''' is returned.
 
* {{LSLP|y}} is negative, '''-PI/2''' is returned.
Or <code>(({{LSLPT|y}} > 0) - ({{LSLPT|y}} < 0)) * [[PI_BY_TWO]]</code>.<br />
+
If {{LSLP|x}} is negative zero and...
 +
* {{LSLP|y}} is positive zero, '''PI''' is returned.
 +
* {{LSLP|y}} is negative zero, '''-PI''' is returned.
 +
* {{LSLP|y}} is positive, '''PI/2''' is returned.
 +
* {{LSLP|y}} is negative, '''-PI/2''' is returned.
 +
 
 +
Or
 +
<lsl>
 +
if((string)x != (string)0.0 && y == 0.0)//negative zero
 +
    return PI * ~-2*((string)y != (string)0.0));
 +
return ((y > 0) - (y < 0)) * PI_BY_TWO;
 +
</lsl>
 +
 
 +
 
 +
 
 
The returned value is in the range {{Interval|gte=-[[PI]]|gteh=-PI|lte=PI|center=return}}{{Interval/Footnote}}.
 
The returned value is in the range {{Interval|gte=-[[PI]]|gteh=-PI|lte=PI|center=return}}{{Interval/Footnote}}.
 
|caveats
 
|caveats

Revision as of 22:38, 27 October 2012

Summary

Function: float llAtan2( float y, float x );

Returns a float that is the arctangent2 of y, x.

• float y
• float x

Similar to the arctangent(y/x) except it utilizes the signs of x & y to determine the quadrant and avoids division by zero.

Specification

[9:10] Object: llAtan2(+0, +0) = 0.000000 [9:10] Object: llAtan2(+0, -0) = 3.141593 [9:10] Object: llAtan2(-0, +0) = 0.000000 [9:10] Object: llAtan2(-0, -0) = -3.141593

If x is positive zero and...

  • y is zero, zero is returned.
  • y is positive, PI/2 is returned.
  • y is negative, -PI/2 is returned.

If x is negative zero and...

  • y is positive zero, PI is returned.
  • y is negative zero, -PI is returned.
  • y is positive, PI/2 is returned.
  • y is negative, -PI/2 is returned.

Or <lsl> if((string)x != (string)0.0 && y == 0.0)//negative zero

   return PI * ~-2*((string)y != (string)0.0));

return ((y > 0) - (y < 0)) * PI_BY_TWO; </lsl>


The returned value is in the range [-PI, PI][1].

Examples

<lsl>default {

 state_entry()
 {
   float num1 = llFrand(100.0);
   float num2 = llFrand(100.0);
   llOwnerSay("y = " + (string)num1);
   llOwnerSay("x = " + (string)num2);
   llOwnerSay("The arctangent of y divided by x is " + (string)llAtan2(num1, num2));
 }

}</lsl><lsl>//Function with input of a vector determining the position of a target and returning //a string with the literal compass-direction of that target towards your position //by Ramana Sweetwater 2009/01, any use allowed license :-) //corrected by Patrick Muggins

string compass (vector target) {

   vector source = llGetPos();
   list DIRS =["W","NW","N","NE","E","SE","S","SW","W"];
   integer index = llCeil(3.5 - (4 * llAtan2(target.y - source.y, target.x - source.x) / PI));
   return llList2String(DIRS, index);

}</lsl>

/Compass QA

See Also

Functions

• llSin llAsin sine & inverse Sine
• llCos llAcos cosine & inverse cosine
• llTan tangent

Articles

•  Wikipedia:Atan2
•  Wikipedia:Inverse trigonometric function

Deep Notes

Search JIRA for related Issues

Footnotes

  1. ^ The ranges in this article are written in Interval Notation.

Signature

function float llAtan2( float y, float x );