Проверьте, перекрываются ли два прямоугольника или касаются ли края

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

И я не уверен, правильно ли я это сделал? Мое требование — если границы второго прямоугольника пересекаются с границами первого прямоугольника, то второй должен быть оставлен. Остальное, фильтр.

0

Решение

Ваше решение не правильно.

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

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

1

Другие решения

Других решений пока нет …