Мне просто интересно, что произойдет, если вы примените следующий подход:
Думайте о своем полигоне как о матрице 2 x N
P = [x1, x2, ..., xN;
y1, y2, ..., yN];
, где каждый столбец содержит x и yкоордината вершины многоугольника.Затем для любого угла phi
между, скажем, 0
и pi/2
определите матрицу вращения
U(phi) = [cos(phi) -sin(phi);
sin(phi) cos(phi)];
После этого поверните многоугольник на угол phi, умножив матрицы
P_phi = U(phi)*P;
Тогда функция
f(phi) = ( max( P_phi[1][] ) - min( P_phi[1][] ) )*( max( P_phi[2][] ) - min( P_phi[2][] ) )
- это площадь прямоугольника с горизонтальными и вертикальными краями, надписанная вокруг повернутого многоугольника P(phi)
.Здесь P_phi[1][]
- первая строка координат x матрицы P_phi, а P_phi[2][]
- вторая строка координат y.Следовательно, вы хотите найти угол phi
и вершины, собранные в матрице 2 x 4 R_phi
, прямоугольника, выровненного по осям, который дает минимум функции f(phi)
для phi in [0, pi/2]
, потому что этоплощадь прямоугольника наименьшей площади, надписанного вокруг вашего многоугольника.После того, как вы найдете phi
и R_phi
, просто поверните назад, как показано ниже R = U(-phi)*R_phi
, и это прямоугольник, который вы ищете.
Я не уверен, работает ли это предложение ...