Вычисление площади выпуклого корпуса в scipy

Я хотел вычислить выпуклую оболочку для пары точек на плоскости, используя scipy.

Вот мой код:

import numpy as np
from scipy.spatial import ConvexHull

points = np.array([[10, 10], [30, 10], [30, 20], [10, 20]])
hull = ConvexHull(points)
print(hull.vertices, hull.area)

Он печатает: [0 1 2 3] 60.0

Итак, возвращается периметр, а не площадь (я проверил другой пример, такое же поведение). Это ошибка? Python 3.7.4 (64-разрядная версия), scipy 1.3.1.


person Lucek008    schedule 20.10.2019    source источник


Ответы (2)


Я полагаю, что hull.area относится к периметру в 1D и к площади в 2D. Если вы хотите, чтобы область была ограничена 1D-оболочкой или объем был ограничен 2D-оболочкой, вместо этого вызовите hull.volume.

person olivaw    schedule 20.10.2019

определение выпуклой оболочки основано на периметре, а не на площади:

В математике выпуклая оболочка, выпуклая оболочка или выпуклое замыкание множества X точек на евклидовой плоскости или в евклидовом пространстве (или, в более общем смысле, в аффинном пространстве над вещественными числами) — это наименьшее выпуклое множество, содержащее X. Например, когда X является ограниченным подмножеством плоскости, выпуклая оболочка может быть визуализирована как форма, заключенная в резиновую ленту, натянутую вокруг X.

Так что это ожидаемый результат. Хотя мне кажется, что вы напечатали и точки периметра ([0 1 2 3]), и площадь (60.0)?

person Nick Martin    schedule 20.10.2019
comment
Ага, я знаю, что такое выпуклая оболочка, вот только терминология (площадь, объем) меня все равно смущает. Я также напечатал точки периметра, просто чтобы показать, что они вычисляются правильно. Только 60,0 для моего примера - это расстояние вокруг квадрата, т.е. то, что я бы назвал периметром (согласно определению школы или википедии). Площадь моего квадрата равна 10000,0, что получается после вызова hull.volume. Спасибо за ваш ответ. - person Lucek008; 20.10.2019