原文出自:www.hangge.com 转载请保留原文链接:https://www.hangge.com/blog/cache/detail_383.html
判断一个点是否在一个多边形区域内部,大致原理如下:
从该点向右引一条水平射线,计算与多边形区域边的交点,如果交点个数为偶数个,则该点在区域外部,如果为奇数个,该点在区域内部。
对应的AS代码如下:
private function ptInPolygon (p:Point, areaPoints:Array):Boolean { // 交点个数 var nCross:int = 0; for (var i:int = 0; i < areaPoints.length; i++) { var p1:Point = areaPoints[i]; var p2:Point = areaPoints[(i + 1) % areaPoints.length];// 最后一个点与第一个点连线 if ( p1.y == p2.y ) continue; if ( p.y < Math.min(p1.y, p2.y) ) continue; if ( p.y >=Math.max(p1.y, p2.y) ) continue; // 求交点的x坐标 var x:Number = (Number)(p.y - p1.y) * (Number)(p2.x - p1.x) / (Number)(p2.y - p1.y) + p1.x; // 只统计p1p2与p向右射线的交点 if ( x > p.x ) { nCross++; } } // 交点为偶数,点在多边形之外 return (nCross % 2 == 1); } protected function test(event:FlexEvent):void { var p:Point = new Point(150,150); var areaPoints:Array = [ new Point(100,100), new Point(200,100), new Point(200,200), new Point(100,200)]; trace(ptInPolygon(p,areaPoints)); }