2016-04-18 12 views
0

У нас есть облако с тремя точками, где есть некоторые цилиндрические формы. Мы можем програмировать доступ к каждой из координат точки (x, y, z).Можете ли вы предложить алгоритм, который будет отмечать точки, принадлежащие цилиндру?

+0

Что вы знаете о цилиндре? Оказывается ли ось цилиндра параллельна оси z? Вы пытаетесь настроить/настроить цилиндр для покрытия большого количества очков? –

+0

Я пытаюсь получить доступ к каждой точке из любой из координат (x, y, z), где каждая точка, принадлежащая цилиндру @Danial –

ответ

0

Проверить, если г находится в пределах [minz..maxz]

if (z > maxz || z < minz) 
    return false; 

Затем посмотреть, если точка находится внутри круга центра (centerX,centerY) и radious R:

return ((x-centerX)*(x-centerX) + (y-centerY)*(y-centerY) <= R*R); 

это предполагает, что цилиндр не поворачивается

+0

@ Исключение я немного путаюсь в этой строке «точка находится внутри круга центра (centerX , centerY) «может и PLZ объяснить это снова ясно. thnx заранее –

+0

@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

+0

thnx @exception –

1

Вы можете использовать алгоритм RANSAC. На странице Википедии есть пример для двумерного облака точек и строки. Расширение его до 3D и цилиндра легко.

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

Для цилиндра, который вам нужен, Я думаю, 4 5 баллов, чтобы получить его радиус и вектор основной оси. Тогда вам могут понадобиться другие точки, чтобы определить высоту цилиндра, если это ваш случай.

Существует статья, посвященная определению цилиндрических уравнений из пяти точек: Cylinders Through Five Points: Computational Algebra and Geometry. Он также имеет Mathematica код в приложении и множество ссылок на другие статьи.

+0

@zagkljan можете ли вы рассказать мне о математической модели цилиндра ..... ??? thnx заблаговременно –

+0

@AbdurRazzak Я добавил ссылку на статью, которая может дать вам ответы. – zegkljan

0

намечение решения: (Мы использовали подобное решение в прошлом, но я потерял деталь)

Вы в основном должны найти центра (C), оси (п) (направляющие косинусы) и радиус (r) для цилиндра.

Тогда для каждой точки P, отклонение (или ошибка) от желаемого цилиндра и точек (вычисления нормального расстояния между точкой и осью).

delta^2 = |(P -C) - (P - C) . n * n|^2 - r^2

Мы должны минимизировать ошибку. Используя частичное дифференцирование и средние векторы, мы можем узнать значения, соответствующие минимальной ошибке. Также можно пробовать точки (если мы знаем, что они принадлежат к одной и той же поверхности).