isPointInPolygon2D
Revision as of 04:19, 10 August 2008 by Haravikk Mistral (talk | contribs)
LSL Portal | Functions | Events | Types | Operators | Constants | Flow Control | Script Library | Categorized Library | Tutorials |
Summary
Function: integer isPointInPolygon2D( vector point, list polygon );
Tests a polygon (described as a list of 2D vectors) to see if a 2D point lies within it. Useful for detecting where an event occurred within 2D space.
Returns an integer TRUE if the point lies within the described polygon, FALSE if not
• vector | point | – | The point to test for, described by a 2D vector (a vector using only the x and y values) | |
• list | polygon | – | A polygon described as a list of 2D vectors for its points |
It is possible (and fairly easy) to adapt this function to use a list of paired floats, both implementations are provided.
Examples
if (isPointInPolygon2D(<0.5,0.5,0>, [<0,0,0>, <0,1,0>, <1,1,0>, <1,0,0>])) llOwnerSay("Point is in polygon");
Implementations
Vectors
<lsl>integer isPointInPolygon2D(vector point, list polygon) {
integer l = polygon != []; integer i = 0; integer j = l - 1; integer inPoly = FALSE; vector iv; vector jv; float diffY; while (i < l) { iv = llList2Vector(polygon, i); jv = llList2Vector(polygon, j); diffY = (jv.y - iv.y); if (diffY == 0.0) diffY = 1000.0; if ((((iv.y <= point.y) && (point.y < (jv.x - iv.x) * (point.y - iv.y) / diffY + iv.x)))) inPoly = !inPoly; j = i++; }
return inPoly != 0;
}</lsl>
Float-pairs
<lsl>integer isPointInPolygon2D(float x, float y, list polygon) {
integer l = polygon != []; integer i = 0; integer j = l - 2; integer inPoly = FALSE; float ix; float iy; float jx; float jy; float diffY; while (i < l) { ix = llList2Float(polygon, i); iy = llList2Float(polygon, ++i); jx = llList2Float(polygon, j); jy = llList2Float(polygon, ++j); diffY = (jy - iy); if (diffY == 0.0) diffY = 1000.0; if ((((iy <= y) && (y < (jx - ix) * (y - iy) / diffY + ix)))) inPoly = !inPoly; j = i++; }
return inPoly != 0;
}</lsl>