Существует ли алгоритм нахождения замкнутого цилиндра с наименьшим радиусом для 3D-облака точек? Я знаю, что 2D файл с наименьшим охватывающим кругом решается (например, этот поток Наименьший охватывающий круг в Python, ошибка в коде), но есть ли какой-либо рабочий подход для 3D?
EDIT1: ФЖДА. Ниже приведен пример дугообразного облака точек. Наименьший охватывающий круг был найден этим инструментом https://www.nayuki.io/page/smallest-enclosing-circle
Круг определяется тремя точками, из которых два лежат почти на диаметре, поэтому легко оценить, где находится центральная ось. "Бокс" из точек даст центр коробки, очевидно, сильно переместился от истинного центра.
Я заключаю, что подход OBB не является общим.
EDIT2: PCA. Ниже приведен пример PCA-анализа узкого облака точек и облака точек с выбросами. Для плотного облака точек PCA удовлетворительно предсказывает направление цилиндра. Но если есть небольшое количество выбросов, по сравнению с основным облаком, то PCA будет в основном игнорировать их, получая векторы, которые очень далеки от истинной оси окружающего цилиндра. В приведенном ниже примере истинная геометрическая ось окружающего цилиндра показана черным цветом.
Я пришел к выводу, что подход СПС не является общим.
EDIT3: OBB против PCA и OLS. Основное различие - OBB полагается только на геометрическую форму, тогда как PCA и OLS зависят от общего количества точек, в том числе от середины набора, которые не влияют на форму. Чтобы сделать их более эффективными, можно включить этап подготовки данных. Сначала найдем выпуклую оболочку. Во-вторых, исключить все внутренние точки. Тогда точки вдоль корпуса могут распределяться неравномерно. Я бы предложил удалить все из них, оставив только тело многоугольного корпуса и накрыв его сеткой, где узлы будут новыми точками. Применение PCA или OLS к этому новому облаку точек должно обеспечить гораздо более точную оценку оси цилиндра.
Все это может быть ненужным, если OBB обеспечивает как можно большую ось вокруг оси цилиндра.
EDIT4: опубликованные подходы. @meowgoesthedog: статья Мишеля Петиджана ("Об алгебраических решениях проблем с маленькими замкнутыми цилиндрами") может помочь, но я недостаточно квалифицирован, чтобы преобразовать ее в рабочую программу. Сам автор сделал это (модуль CYL здесь http://petitjeanmichel.free.fr/itoweb.petitjean.freeware.html). Но в выводах, содержащихся в документе, он говорит: "И настоящее программное обеспечение, названное CYL, загружаемое бесплатно на http://petitjeanmichel.free.fr/itoweb.petitjean.freeware.html, не претендует на то, чтобы предлагать наилучшие варианты реализации методов и, как утверждается, работают лучше, чем другие программные средства для вычисления числа цилиндров ". Другие фразы из статьи также создают впечатление, что это экспериментальный подход, который не был тщательно проверен. Во всяком случае, я попытаюсь использовать его.
@Ripi2: эта статья Тимоти М. Чан также слишком сложна для меня. Я не специалист этого уровня в математике, чтобы иметь возможность конвертировать в инструмент.
@Helium_1s2: возможно, это хорошее предложение, однако оно гораздо менее подробно по сравнению с двумя вышеприведенными работами. Кроме того, не проверяется.
EDIT5: ответ для пользователя1717828. Две самые отдаленные точки относительно оси цилиндра. Пример счетчика - 8 точек в форме куба, вписываются в цилиндр. Самое большое расстояние между двумя точками - зеленая диагональ. Очевидно, что он не параллелен оси цилиндра.
Подход "Middle-points" от Ripi2: он работает только в 2D. В трехмерном случае ось цилиндра может не пересекать один сегмент между любыми двумя точками.