• 判断点是否在点组成的封闭区域内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. }

  • 相关阅读:
    2个小时的腾讯面试经历(C++),来看看它终究考察了些什么?
    SpringBoot开发的实用小工具集,YYDS
    java 版本企业招标投标管理系统源码+功能描述+tbms+及时准确+全程电子化
    GD32f103系列教程—(时钟篇)
    SnowNLP使用自定义语料进行模型训练(情感分析)
    Leetcode71简化路径
    Ubuntu入门05——磁盘管理与备份压缩
    css3 hover效果
    【IoT】从马斯克造火箭到产品开发,快速失败很重要
    【云原生 | Kubernetes 系列】---Prometheus Blackbox_exporter监控
  • 原文地址:https://blog.csdn.net/qq_35102059/article/details/126544577