Проверьте, перекрываются ли два прямоугольника или касаются ли края - PullRequest
0 голосов
/ 28 декабря 2018

Я получаю географические координаты в 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 голосов
/ 28 декабря 2018

Ваше решение не является правильным.

Помимо путаницы значения широты и долготы, у вас есть фундаментальная проблема, заключающаяся в том, что алгоритмы, разработанные для декартового координатного пространства, не работают в цилиндрических координатах, поскольку долгота является периодической.Вещи могут выглядеть хорошо для прямоугольников около меридиана, но когда вы начнете тестирование около точки обтекания (+/- 180 градусов по долготе), этот метод потерпит неудачу.

Одно простое решение - разбить каждый прямоугольник, пересекающий оберткуукажите на два, которые не пересекаются.

...