【问题标题】:Check if polygons intersect in c++检查多边形是否在c ++中相交
【发布时间】:2016-03-17 21:41:50
【问题描述】:

我有两个多边形,它们的最小值和最大值、纬度和经度如下所示:

Polygon A: minimum_latitude=2.089 degree, maximum_latitude=2.93 degree, minimum_longitude=-122.95 degree, maximum_longitude=-122.85 degree

Polygon B: minimum_latitude=2.1 degree, maximum_latitude=2.83 degree, minimum_longitude=-121.95 degree, maximum_longitude=-120.85 degree

如何在 c++ 中检查多边形 A 是否与多边形 B 相交(或包含在其中)?

我的纬度和经度以度为单位。我是否需要将它们转换为弧度以检查多边形是否相交?

检查相交的一种方法是检查多边形 B 的 minimum_latitude 是否位于多边形 A 的 minimum_latitude 和 maximum_latitude 之间,反之亦然?这是正确的检查方法吗。是否需要将纬度和经度转换为弧度才能执行相交测试。

【问题讨论】:

  • 我可以想到多边形,这会使您在上一段中给出的解决此问题的想法不起作用;)
  • @BitTickler 好的。那你能建议一些解决方案吗:)
  • 这不是两个轴对齐矩形的交点吗?
  • @DieterLücking 是的,交叉点在两个轴对齐的矩形之间
  • 我认为你可以使用扫描线算法。在空间上扫线并为沿线的每个多边形创建边列表。对于中途的普通多边形(是的,还有一些有趣的多边形,比如自相交多边形),这会产生不相交的线段或相交的线段,这反过来很容易处理。 [A1;A2; B1;B2] [A1;B1;A2;B2]

标签: c++ geospatial


【解决方案1】:

不需要任何外部库等。

  1. 按照康斯坦丁的建议,通过范围检查排除不相交的多边形
  2. 通过在两个方向上再次进行简单的范围检查来检查 poly1 的任何点是否在 poly2 内。如果有的话,它们是相交的,如果是全部,则它被包含。
  3. 控制对面的2组
  4. 使用 2 和 3 的结果准备候选线,然后将光线从一个多边形发送到另一个多边形的线。如果有任何命中,则它们相交。

就是这样。

这是最简单快捷的方法。如果您想通过使用排序数据或八叉树等进行多项优化。

【讨论】:

  • 这仍然适用于两个相交但没有点位于另一个多边形内的多边形吗?例如,两个组成十字形的矩形。
  • 那么你将需要线交叉点。仍然在上面的答案将提供快速和适当的过滤
【解决方案2】:

如果多边形不相交,您可以使用最小值/最大值快速检查;如果边界矩形重叠,则封闭的多边形可能相交......但您需要进一步检查以确定。除非您使用 Polygons 仅存储简单的矩形 ;)

【讨论】:

  • 非常感谢您的回复。我正在使用多边形来存储简单的矩形。还有一个问题:我应该在检查交叉点之前将度数转换为弧度吗
  • 只要一切使用相同的单位,就可以了。
  • 谢谢 :) 有时我还需要将多边形扩展一定距离 d=10 公里。那么,您认为弧度会更适合扩展多边形吗?
  • 弧度是一个旋转测量单位。扩展多边形是一些矩形线的平移,所以弧度或任何与扩展多边形无关。
【解决方案3】:

有一个很棒的 Polygon Collision 算法可能正是您正在寻找的: 本质上,您检查多边形之间的最短距离。

【讨论】:

    猜你喜欢
    • 2021-07-11
    • 2014-01-24
    • 2021-07-13
    • 2018-03-09
    • 2011-06-17
    • 1970-01-01
    • 2014-03-21
    • 2021-02-21
    • 2016-03-26
    相关资源
    最近更新 更多