• 判断点是否在点组成的封闭区域内c++


    大致方法可以有3种:

    方法1:面积法

    判断目标点与多边形的每条边组成的三角形面积和是否等于该多边形,相等则在多边形内部。

    方法2:角度法

    判断目标点与所有边的夹角和是否为360度,为360度则在多边形内部。

    方法3:射线法

    从目标点出发引一条射线,看这条射线和多边形所有边的交点数目:
    如果有奇数个交点,则说明在内部
    如果有偶数个交点,则说明在外部

    方法1,2对精度要求高,且计算效率较低,故经常使用射线法;

    射线法逻辑:

    从点P作y轴正向的射线:

    (1)若射线与多边形的交点为奇数,则P在多边形内部;

    (2)若射线与多边形的交点为偶数,则P在多边形外部。

    特殊情况(若边为(P1,P2)):

    (1)如果射线正好穿过P1或者P2点,那么这个交点会被算作2次,处理办法取(P1,P2];
    (2)如果边与射线平行,则射线要么与其无交点,要么有无数个,这种情况也直接忽略;(实际上,此类情况存在bug)
    (3)如果边与射线垂直,而P的y坐标小于P1,P2的y坐标,则必然相交;
    (4)再判断相交之前,先判断P是否在边(P1,P2)的上面,如果在,则直接得出结论:P再多边形内部。

    射线法c++实现代码:

    1. struct Point
    2. {
    3. double x;
    4. double y;
    5. double z;
    6. };
    7. bool IsPointInPolygon(const Point& vtPoint, const vector& vecPoints)
    8. {
    9. bool bResult = false; //判断结果(true;点落在多边形内;false:点未落在多边形内)
    10. int nSize = vecPoints.size();
    11. int pre = nSize - 1;//nSize -1 是多边形的最后一个顶点
    12. for (int cur = 0; cur < nSize; ++cur)
    13. {
    14. //判断点是否在线段的两侧
    15. if ((vecPoints[cur].x < vtPoint.x && vecPoints[pre].x >= vtPoint.x)
    16. || (vecPoints[pre].x < vtPoint.x && vecPoints[cur].x >= vtPoint.x))
    17. {
    18. //根据两点式方程计算出过点P且平行于X轴的直线与线段的交点,两点式方程:
    19. // y = p1.y + (p.x - p1.x) * (p2.y - p1.y) / (p2.x - p1.x)
    20. double line_p_y = vecPoints[cur].y + (vtPoint.x - vecPoints[cur].x) * (vecPoints[pre].y - vecPoints[cur].y)
    21. / (vecPoints[pre].x - vecPoints[cur].x);
    22. if (line_p_y > vtPoint.y)
    23. {
    24. bResult = !bResult;
    25. }
    26. else if(line_p_y == vtPoint.y)
    27. {
    28. return true;
    29. }
    30. }
    31. //进行下一线段判断
    32. pre = cur;
    33. }
    34. return bResult;
    35. }

  • 相关阅读:
    【云开发】小程序端中使用云函数的介绍
    跨境电商指南:如何处理客户投诉
    AI为方,产业为向:京东云数字人的技术攀爬
    Open3D官方文档学习笔记
    python使用websocket服务传输数据的例子,可以保持长连接
    JAVA URL请求
    C/C++疫情集中隔离 2021年12月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析
    生鲜行业B2B电子商务交易系统:缩短企业供采交易链路,掘金万亿级生鲜B2B
    QT连接Mysql数据库(详细成功版)
    中国312个历史文化名镇及景区空间点位数据集
  • 原文地址:https://blog.csdn.net/qq_35102059/article/details/126544577