mirror of
https://github.com/opensim/opensim.git
synced 2026-08-05 00:46:02 +08:00
Fixed llAngleBetween() to allow denormal rotations
This commit is contained in:
committed by
Justin Clark-Casey (justincc)
parent
8c445dac67
commit
ff5a83d192
@@ -4698,15 +4698,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||
return (double)Math.Asin(val);
|
||||
}
|
||||
|
||||
// Xantor 30/apr/2008
|
||||
// jcochran 5/jan/2012
|
||||
public LSL_Float llAngleBetween(LSL_Rotation a, LSL_Rotation b)
|
||||
{
|
||||
m_host.AddScriptLPS(1);
|
||||
|
||||
double angle = Math.Acos(a.x * b.x + a.y * b.y + a.z * b.z + a.s * b.s) * 2;
|
||||
if (angle < 0) angle = -angle;
|
||||
if (angle > Math.PI) return (Math.PI * 2 - angle);
|
||||
return angle;
|
||||
double aa = (a.x * a.x + a.y * a.y + a.z * a.z + a.s * a.s);
|
||||
double bb = (b.x * b.x + b.y * b.y + b.z * b.z + b.s * b.s);
|
||||
double aa_bb = aa * bb;
|
||||
if (aa_bb == 0) return 0.0;
|
||||
double ab = (a.x * b.x + a.y * b.y + a.z * b.z + a.s * b.s);
|
||||
double quotient = (ab * ab) / aa_bb;
|
||||
if (quotient >= 1.0) return 0.0;
|
||||
return Math.Acos(2 * quotient - 1);
|
||||
}
|
||||
|
||||
public LSL_String llGetInventoryKey(string name)
|
||||
|
||||
Reference in New Issue
Block a user