【问题标题】:Check if two rectangles overlap or the edges touch检查两个矩形是否重叠或边缘是否接触
【发布时间】:2019-05-26 10:20:48
【问题描述】:

我获得了经度和纬度的地理坐标,例如西北和东南经度/纬度。所以,当我得到它们时,我会翻译成公制。所以在这里我得到了我的第一个矩形,带有north_west和south_east坐标,然后我在具有北、南、西和东坐标的同一公制系统中有边界矩形。我需要检查这两个矩形在边缘触摸的交叉点上,我写的是:

bool filter(TilePosition const& tile_position) const noexcept override 
{
    MetricBoundingBox tile_bounds{tile_position};

    bool cond1 = (tile_bounds.north <= south_east_.lon);
    bool cond2 = (tile_bounds.south >= north_west_.lon);
    bool cond3 = (tile_bounds.west <= south_east_.lat);
    bool cond4 = (tile_bounds.east >= north_west_.lat);

    return cond1 && cond2 && cond3 && cond4;
} 

我不确定我做得对不对?我的要求是,如果第二个矩形的边界与第一个矩形的边界相交,则必须留下第二个。否则,过滤。

【问题讨论】:

  • 也相关(与语言无关):Two Rectangles intersection
  • @scohe001 我看到了这个问题,但我需要检查我的解决方案是否正确?真的很难为我测试它。
  • 您检查第一个矩形是否在边界内,这可能正确与否取决于要求。如果两个矩形部分重叠,您的条件将返回 false
  • 另外,编写一些测试以确保您的代码正确是一个好习惯。除了通过分析证明算法的正确性之外,这是确定这一点的最简单方法。相对于这个问题,你可以只检查几个边缘情况和简单的重叠。

标签: c++ geometry cartography


【解决方案1】:

您的解决方案不正确。

除了混淆纬度和经度的含义之外,您还有一个基本问题,即为笛卡尔坐标空间设计的算法不适用于柱坐标,因为经度是周期性的。对于子午线附近的矩形,情况可能看起来不错,但是当您在环绕点(+/- 180 度经度)附近开始测试时,此方法将失败。

一个简单的解决方法是将穿过环绕点的每个矩形分成两个不交叉的矩形。

【讨论】:

    猜你喜欢
    • 2017-05-13
    • 1970-01-01
    • 1970-01-01
    • 2018-09-29
    • 1970-01-01
    • 1970-01-01
    • 2020-06-19
    • 1970-01-01
    相关资源
    最近更新 更多