Самое простое решение, и я предполагаю, что наиболее вероятное решение - вычислить ограничивающий прямоугольник, выровненный по оси, что является просто случаем нахождения значений min / max x & y, а затем построением коробка из тех.
Я дам вам псевдокод для этого, учитывая, что вы не опубликовали типы, в которых выражена ваша геометрия ...
type point { float x; float y; }
type box { point topleft; point topright; point bottomleft; point bottomright; }
function bounding_box(points)
{
xmin = min(points.x)
xmax = max(points.x)
ymin = min(points.y)
ymax = max(points.y)
return new box{
topleft = { x = xmin, y = ymax },
topright = { x = xmax, y = ymax },
bottomleft = { x = xmin, y = ymin },
bottomright = { x = xmax, y = ymin }
};
}
Итак, учитывая эти:
point[] points = [[x = -2, y = 0], [x = 1, y = 2], [x = 1, y = 1], [x = -1, y = -2]];
box bounds = bounding_box(points);
Все следующее будет верно:
bounds.topleft == [x = -2, y = 2];
bounds.topright == [x = 1, y = 2];
bounds.bottomleft == [x = -2, y = -2];
bounds.bottomright == [x = -1, y = -2];
Конечно, если система координат имеет самые низкие координаты в верхней части (например, как в обычном отображении) - тогда вам нужно инвертировать вычисления; или сначала вычислите результат в объектном пространстве, а затем переведите его в логическое пространство.
Обратите внимание, что я выбрал тип для прямоугольника, который выражает все четыре угла, на случай, если в будущем вы решите обновить его до произвольно выровненного прямоугольника (хотя по тому же признаку вы можете просто использовать точку 2 вектора для этого).