Difference between revisions of "LlVecDist"

From Second Life Wiki
Jump to: navigation, search
m (lsl code tagging)
m (Replaced old <LSL> block with <source lang="lsl2">)
 
(7 intermediate revisions by 6 users not shown)
Line 6: Line 6:
 
|p2_type=vector|p2_name=vec_b|p2_desc=Any valid vector
 
|p2_type=vector|p2_name=vec_b|p2_desc=Any valid vector
 
|return_type=float
 
|return_type=float
|return_text=that is the undirected nonnegative distance between '''vec_a''' and '''vec_b''' ( [[llVecMag]]('''vec_a''' - '''vec_b''') ).
+
|return_text=that is the undirected nonnegative distance between {{LSLP|vec_a}} and {{LSLP|vec_b}}.
 
|spec
 
|spec
 
|caveats
 
|caveats
 
|constants
 
|constants
 
|examples=
 
|examples=
<lsl>
+
<source lang="lsl2">
 
default {
 
default {
 
     state_entry()
 
     state_entry()
Line 17: Line 17:
 
         vector input_1 = <1.0,2.0,3.0>;
 
         vector input_1 = <1.0,2.0,3.0>;
 
         vector input_2 = <3.0,2.0,1.0>;
 
         vector input_2 = <3.0,2.0,1.0>;
         llOwnerSay("The distance between " + (string) input_1 + " and " + (string) input_2 + " is: "+(string)llVecDist(input_1, input_2) );
+
         llOwnerSay("The distance between " + (string) input_1 +
 +
            " and " + (string) input_2 + " is: "+(string)llVecDist(input_1, input_2) );
 
     }
 
     }
 
}
 
}
</lsl>
+
</source>
 +
<source lang="lsl2">
 +
//To reset script on touch if the object has been rotated since the last script reset
 +
float gTolerance = 0.05;  //This corresponds to about a 3 degree rotation
 +
default
 +
{
 +
state_entry()
 +
{
 +
llSetObjectDesc((string)llRot2Euler(llGetRot()));
 +
}
 +
 +
touch_start(integer total_number)
 +
{
 +
if (llVecDist(llRot2Euler(llGetRot()), (vector)llGetObjectDesc()) > gTolerance)
 +
{
 +
llSay(0,"This object has rotated. Automatic reset engaged.");
 +
llResetScript();
 +
}
 +
}
 +
}</source>
 +
===Video Tutorial===
 +
{{KBvideo|D0WvH58IWEo|640|385|type=youtube}}
 
|helpers
 
|helpers
 
|also_functions={{LSL DefineRow||[[llVecMag]]|}}
 
|also_functions={{LSL DefineRow||[[llVecMag]]|}}
Line 27: Line 49:
 
|also_tests
 
|also_tests
 
|also_articles
 
|also_articles
|notes
+
|notes=
 +
* Mathematically equivalent to:
 +
** [[llVecMag]]( vec_a - vec_b )
 +
** [[llSqrt]]( (vec_b.x - vec_a.x) * (vec_b.x - vec_a.x) + (vec_b.y - vec_a.y) * (vec_b.y - vec_a.y) + (vec_b.z - vec_a.z) * (vec_b.z - vec_a.z) )
 +
* Knowing this, there are ways to circumvent llVecDist for more efficient code.
 +
** For example, vector v3 = (v1-v2); v3*v3 < (f*f); is over twice as fast as llVecDist(v1,v2) < f;
 
|cat1=Math/3D
 
|cat1=Math/3D
 
|cat2=Vector
 
|cat2=Vector
 +
|haiku={{Haiku|Squirrel on a wire,|Skips from pole to distant pole.|One leap at a time.}}
 
|cat3
 
|cat3
 
|cat4
 
|cat4
 
}}
 
}}

Latest revision as of 12:02, 22 January 2015

Summary

Function: float llVecDist( vector vec_a, vector vec_b );

Returns a float that is the undirected nonnegative distance between vec_a and vec_b.

• vector vec_a Any valid vector
• vector vec_b Any valid vector

Examples

default {
    state_entry()
    {
        vector input_1 = <1.0,2.0,3.0>;
        vector input_2 = <3.0,2.0,1.0>;
        llOwnerSay("The distance between " + (string) input_1 +
            " and " + (string) input_2 + " is: "+(string)llVecDist(input_1, input_2) );
    }
}
//To reset script on touch if the object has been rotated since the last script reset
float gTolerance = 0.05;  //This corresponds to about a 3 degree rotation
default
{
	state_entry()
	{
		llSetObjectDesc((string)llRot2Euler(llGetRot()));
	}
 
	touch_start(integer total_number)
	{
		if (llVecDist(llRot2Euler(llGetRot()), (vector)llGetObjectDesc()) > gTolerance)
		{
			llSay(0,"This object has rotated. Automatic reset engaged.");
			llResetScript();
		}
	}
}

Video Tutorial

Notes

  • Mathematically equivalent to:
    • llVecMag( vec_a - vec_b )
    • llSqrt( (vec_b.x - vec_a.x) * (vec_b.x - vec_a.x) + (vec_b.y - vec_a.y) * (vec_b.y - vec_a.y) + (vec_b.z - vec_a.z) * (vec_b.z - vec_a.z) )
  • Knowing this, there are ways to circumvent llVecDist for more efficient code.
    • For example, vector v3 = (v1-v2); v3*v3 < (f*f); is over twice as fast as llVecDist(v1,v2) < f;

See Also

Functions

•  llVecMag
•  llVecNorm

Deep Notes

Search JIRA for related Issues

Signature

function float llVecDist( vector vec_a, vector vec_b );

Haiku

Squirrel on a wire,
Skips from pole to distant pole.
One leap at a time.