当前位置: > > > [AS]判断一个点是否在一个不规则的多边形区域内部

[AS]判断一个点是否在一个不规则的多边形区域内部

判断一个点是否在一个多边形区域内部,大致原理如下:

从该点向右引一条水平射线,计算与多边形区域边的交点,如果交点个数为偶数个,则该点在区域外部,如果为奇数个,该点在区域内部。

对应的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));
}
评论0