У нас есть облако с тремя точками, где есть некоторые цилиндрические формы. Мы можем програмировать доступ к каждой из координат точки (x, y, z).Можете ли вы предложить алгоритм, который будет отмечать точки, принадлежащие цилиндру?
ответ
Проверить, если г находится в пределах [minz..maxz]
if (z > maxz || z < minz)
return false;
Затем посмотреть, если точка находится внутри круга центра (centerX,centerY)
и radious R
:
return ((x-centerX)*(x-centerX) + (y-centerY)*(y-centerY) <= R*R);
это предполагает, что цилиндр не поворачивается
@ Исключение я немного путаюсь в этой строке «точка находится внутри круга центра (centerX , centerY) «может и PLZ объяснить это снова ясно. thnx заранее –
@AbdurRazzak окружность имеет уравнение (x-xc)^2 + (y-yc)^2 = r^2, см. Https://en.wikipedia.org/wiki/Circle#Equations. таким образом, в вашем случае, как только вы проверили, что z в порядке, вам просто нужно проверить, является ли (x, y) точкой, для которой (x-xc)^2 + (y-yc)^2 <= r^2 – Exceptyon
thnx @exception –
Вы можете использовать алгоритм RANSAC. На странице Википедии есть пример для двумерного облака точек и строки. Расширение его до 3D и цилиндра легко.
В принципе, вы произвольно выбираете минимальные подмножества из облака точек, которые полностью определяют цилиндр, вы создаете математическую модель цилиндра, а затем вы смотрите на то, сколько точек подтверждают эту гипотезу (например, они не дальше от смоделированного цилиндра чем некоторый порог), и вы держите лучший цилиндр до сих пор. Вы делаете это несколько раз.
Для цилиндра, который вам нужен,
Я думаю, 4
5 баллов, чтобы получить его радиус и вектор основной оси. Тогда вам могут понадобиться другие точки, чтобы определить высоту цилиндра, если это ваш случай.
Существует статья, посвященная определению цилиндрических уравнений из пяти точек: Cylinders Through Five Points: Computational Algebra and Geometry. Он также имеет Mathematica код в приложении и множество ссылок на другие статьи.
@zagkljan можете ли вы рассказать мне о математической модели цилиндра ..... ??? thnx заблаговременно –
@AbdurRazzak Я добавил ссылку на статью, которая может дать вам ответы. – zegkljan
намечение решения: (Мы использовали подобное решение в прошлом, но я потерял деталь)
Вы в основном должны найти центра (C), оси (п) (направляющие косинусы) и радиус (r) для цилиндра.
Тогда для каждой точки P, отклонение (или ошибка) от желаемого цилиндра и точек (вычисления нормального расстояния между точкой и осью).
delta^2 = |(P -C) - (P - C) . n * n|^2 - r^2
Мы должны минимизировать ошибку. Используя частичное дифференцирование и средние векторы, мы можем узнать значения, соответствующие минимальной ошибке. Также можно пробовать точки (если мы знаем, что они принадлежат к одной и той же поверхности).
Что вы знаете о цилиндре? Оказывается ли ось цилиндра параллельна оси z? Вы пытаетесь настроить/настроить цилиндр для покрытия большого количества очков? –
Я пытаюсь получить доступ к каждой точке из любой из координат (x, y, z), где каждая точка, принадлежащая цилиндру @Danial –