原文出自: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));
}

  



posted on 2020-04-21 11:29  我是cdt  阅读(656)  评论(0编辑  收藏  举报