zoukankan      html  css  js  c++  java
  • 判断一个点是否在一个复杂多边形的内部

    结论:从目标点出发引一条射线,看这条射线和多边形所有边的交点数目。如果有奇数个交点,则说明在内部,如果有偶数个交点,则说明在外部。利用此结论近些代码编写

     

     

     1   // 功能:判断点是否在多边形内 
     2     // 方法:求解通过该点的水平线与多边形各边的交点 
     3     // 结论:单边交点为奇数,成立! 
     4 
     5     // 参数: 
     6     // POINT p 指定的某个点 
     7     // LPPOINT ptPolygon 多边形的各个顶点坐标(首末点可以不一致) 
     8     // int nCount 多边形定点的个数 
     9 
    10     public static bool PointInPolygon(Vector2 p, Vector2[] ptPolygon, int nCount)
    11     {
    12         int nCross = 0;
    13 
    14         for (int i = 0; i < nCount; i++)
    15         {
    16             Vector2 p1 = ptPolygon[i];//当前节点
    17             Vector2 p2 = ptPolygon[(i + 1) % nCount];//下一个节点
    18 
    19             // 求解 y=p.y 与 p1p2 的交点 
    20 
    21             if (p1.y == p2.y) // p1p2 与 y=p0.y平行 
    22                 continue;
    23 
    24             if (p.y < Mathf.Min(p1.y, p2.y)) // 交点在p1p2延长线上 
    25                 continue;
    26             if (p.y >= Mathf.Max(p1.y, p2.y)) // 交点在p1p2延长线上 
    27                 continue;
    28 
    29             // 从P发射一条水平射线 求交点的 X 坐标 ------原理: ((p2.y-p1.y)/(p2.x-p1.x))=((y-p1.y)/(x-p1.x)) 
    30             //直线k值相等 交点y=p.y
    31             double x = (double)(p.y - p1.y) * (double)(p2.x - p1.x) / (double)(p2.y - p1.y) + p1.x;
    32 
    33             if (x > p.x)
    34                 nCross++; // 只统计单边交点 
    35         }
    36 
    37         // 单边交点为偶数,点在多边形之外 --- 
    38         return (nCross % 2 == 1);
    39     }
    40 
    41 }

     参考资料:  http://erich.realtimerendering.com/ptinpoly/

     

  • 相关阅读:
    html书签展示(带搜索)
    PHP 无限级分类(递归)
    文件服务器的搭建
    php swoole 和 websocket的初次碰撞
    Linux 服务管理的两种方式service和systemctl
    Jquery 代码参考
    分享几个网址二维码生成api
    WordPress 缩率图学习笔记
    Linux 究级基础入门命令整理
    ltrim的思考
  • 原文地址:https://www.cnblogs.com/grassgarden/p/9250946.html
Copyright © 2011-2022 走看看