вычисление перпендикулярного и углового расстояния между отрезками в 3d - PullRequest
1 голос
/ 07 марта 2011

Я работаю над реализацией алгоритма кластеризации в C ++. Конкретно этот алгоритм: http://www.cs.uiuc.edu/~hanj/pdf/sigmod07_jglee.pdf

В одной точке алгоритма (с. 3.2 p4-5) я должен вычислить перпендикулярное и угловое расстояние (d┴ и dθ) между двумя отрезками линии: p1 - p2, p1 - p3.

Прошло много времени с тех пор, как у меня был математический класс, я немного шокирован тем, что это на самом деле концептуально и как их вычислять. Кто-нибудь может помочь?

Ответы [ 2 ]

1 голос
/ 07 марта 2011

Чтобы получить перпендикулярное расстояние от точки Q до линии, определяемой двумя точками P_1 и P_2, рассчитайте это:

d = DOT(Q, CROSS(P_1, P_2) )/MAG(P_2 - P_1)

, где DOT - это скалярное произведение, CROSS - это векторное перекрестное произведение, а MAG - это величина (sqrt(X*X+Y*Y+..))

.

Используя рис. 5. Вы вычисляете d_1 расстояние от sj до линии (si->ei) и d_2 расстояние от ej до той же линии.

Я бы установил систему координат на основе трех точек: двух (P_1, P_2) для линии и третьего Q для начала или конца другой линии сегмент. Три оси системы координат можно определить так:

e = UNIT(P_2 - P_1)      // axis along the line from P_1 to P_2
k = UNIT( CROSS(e, Q) )  // axis normal to plane defined by  P_1, P_2, Q
n = UNIT( CROSS(k, e) )  // axis normal to line towards Q

где UNIT() - функция для возврата единичного вектора (с величиной = 1).

Затем вы можете установить все ваши проекционные длины с помощью простых точек. Таким образом, учитывая линию si-ei и точку sj на рисунке 5, длины составляют:

(l || 1) = DOT(e, sj-si);
(l |_ 1) = DOT(n, sj-si);
ps = si + e * (l || 1)      //projected point

А с концом второго сегмента ej необходимо вычислить новые координатные оси (e, k, n)

(l || 2) = DOT(e, ei-ej);
(l |_ 1) = DOT(n, ej-ei);
pe = ei - e * (l || 1)      //projected point

В конечном итоге угловое расстояние составляет

(d th)  = ATAN( ((l |_ 2)-(L |_ 1))/MAG(pe-ps) )

PS. Возможно, вы захотите опубликовать это на Math.SO , где вы можете получить лучшие ответы.

1 голос
/ 07 марта 2011

Посмотрите на рисунок 5 на странице 3. Он показывает, что такое d┴ и dθ.

РЕДАКТИРОВАТЬ: «Среднее значение по Лемеру» определяется с использованием Lp-space соглашений.Таким образом, в 3-х измерениях вы бы использовали p = 3. Допустим, что (евклидово) расстояние между двумя начальными точками равно d1, а между концами - d2.Тогда d┴(L1, L2) = (d1^3 + d2^3) / (d1^2 + d2^2).

Чтобы найти угол между двумя векторами, вы можете использовать их точечное произведение .Норма (обозначается ||x||) вычисляется следующим образом .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...