判断点是否位于多边形内(包含凹多边形)

本文介绍了一种用于判断一个点是否位于多边形内的有效方法——射线法。通过从待判断的点出发,绘制一条射线至负无穷,统计射线与多边形边的交点数量来确定点的位置关系。如果交点数为奇数,则点位于多边形内部;反之则在外部。文中还详细讨论了射线法在不同特殊情况下如何正确处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果判断点是否在凸多边形内,则有多种方法,方法简单,计算速度也快,直接使用物理引擎做判断也行
但实际问题中遇到的多边形不一定是凸多边形,它可能是凹边行或者复合多边形判断一个点在多边形内或多边形外,射线法是个不错的选择

射线法:,判断一点是否在多边形内或多边形外,只要从这点起,作一条射线,例如,沿x(或y)向直到负无穷,若与其相交的边是奇,该点位于多边形内;若为偶数,则点位于多边形外。
如下图:

图中,沿P作水平向左的射线,若P在多边形内部,则射线与多边形的交点数为奇数;若P在多边形外部,则交点个数为偶数(包含0)。因此,顺序考虑多边形的每条边,求出交点数目,可判断点是否位于多边形内。特殊情况。如边(P1,P2):
1)若射线恰好穿过P1或者P2,那么这个交点会被算作2次,解决方案是,若P的纵坐标与P1,P2中的纵坐标相同,则将忽略此情况
2)若射线水平,则射线可能与其无交点,可能有无数个,则忽略此情况。
3)若射线竖直,且P的横坐标小于P1,P2的横坐标,则必然相交。
4)在判断相交之前,可先判断P是否在边(P1,P2)的上面,若在,可直接得到结论:P在多边形内部

计算x轴坐标

计算交点逻辑

tanα = b /  c;
tanα = d / a;
d = b*a / c;

源代码:


 
  1. bool HelloWorld::IsPointInsideShape(Vec2 pos, std:: vector<Vec2>& m_vAllShape)
  2. {
  3. int nCross = 0;
  4. int nCount = ( int)m_vAllShape.size();
  5. Vec2 p = pos;
  6. for ( int i = 0; i < nCount; i++)
  7. {
  8. Vec2 p1 = m_vAllShape[i];
  9. Vec2 p2 = m_vAllShape[(i + 1) % nCount];
  10. // 求解 y=p.y 与 p1p2 的交点
  11. if (p1.y == p2.y)
  12. { // p1p2 与 y=p0.y平行
  13. continue;
  14. }
  15. if (p.y < MIN(p1.y, p2.y))
  16. { // 交点在p1p2延长线上
  17. continue;
  18. }
  19. if (p.y >= MAX(p1.y, p2.y))
  20. { // 交点在p1p2延长线上
  21. continue;
  22. }
  23. // 求交点的 X 坐标 --------------------------------------------------------------
  24. double x = ( double)(p.y - p1.y) * ( double)(p2.x - p1.x) / ( double)(p2.y - p1.y) + p1.x;
  25. if (x > p.x){
  26. nCross++; // 只统计单边交点
  27. }
  28. }
  29. // 单边交点为偶数,点在多边形之外
  30. // if (nCross % 2 == 1) {
  31. // log("在多边形内");
  32. // }
  33. // if (nCross % 2 == 0) {
  34. // log("在多边形外");
  35. // }
  36. return (nCross % 2 == 1);
  37. }

转载自: https://blog.csdn.net/yanjunmu/article/details/46723407

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值