检查两个矩形是否重叠或边缘是否接触

时间:2018-12-28 15:55:25

标签: c++ geometry cartography

我在lon和lat得到了地理坐标,例如Northwest和SouthEast lon / lat。因此,当我得到它们时,我将其转换为公制。所以在这里,我得到了第一个具有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;
} 

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

1 个答案:

答案 0 :(得分:1)

您的解决方案不正确。

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

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