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


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

      



  • 相关阅读:
    开发3dMax插件的方法和应用
    实现X*N
    fork与vfork的区别
    使用递归算法写一段程序
    宏和函数的区别
    多线程学习(一)
    [算法天天练]堆排序
    [转][算法天天练]堆与堆排序
    [转]快速排序 挖坑讲解方法
    [算法天天练]选择排序法
  • 原文地址:https://www.cnblogs.com/dt1991/p/12743359.html
Copyright © 2020-2023  润新知