У меня есть набор точек (черные точки в значении географических координат), полученных из выпуклой оболочки (синий) многоугольника (красный). см. рисунок:
[(560023.44957588764,6362057.3904932579),
(560023.44957588764,6362060.3904932579),
(560024.44957588764,6362063.3904932579),
(560026.94957588764,6362068.3904932579),
(560028.44957588764,6362069.8904932579),
(560034.94957588764,6362071.8904932579),
(560036.44957588764,6362071.8904932579),
(560037.44957588764,6362070.3904932579),
(560037.44957588764,6362064.8904932579),
(560036.44957588764,6362063.3904932579),
(560034.94957588764,6362061.3904932579),
(560026.94957588764,6362057.8904932579),
(560025.44957588764,6362057.3904932579),
(560023.44957588764,6362057.3904932579)]
Мне нужно вычислить основную и второстепенную длину оси, выполнив следующие действия (образует этот пост записи в R-проекте и в Java), или после этого примера процедуры
- Вычислить выпуклую оболочку облака.
- Для каждого края выпуклой оболочки: 2a. вычислить ориентацию края, 2b. поверните выпуклый корпус, используя эту ориентацию, чтобы легко вычислить площадь ограничивающего прямоугольника с минимумом/максимумом x/y повернутого выпуклого корпуса, 2с. Сохраните ориентацию, соответствующую найденной минимальной площади,
- Вернуть прямоугольник, соответствующий минимальной найденной площади.
После этого мы знаем угол Theta (представляющий ориентацию ограничивающего прямоугольника относительно оси Y изображения). Минимум и максимум a и b по всем граничным точкам находятся:
- a (xi, yi) = xi * cos Theta + yi sin Theta
- b (xi, yi) = xi * sin Theta + yi cos Theta
Значения (a_max - a_min) и (b_max - b_min) определяют длину и ширину, соответственно, ограничительного прямоугольника для направления Theta.