Рассчитать угол между 3D точками сферы с конкретным центром - PullRequest
1 голос
/ 17 апреля 2019

У меня есть начальная точка в трехмерном пространстве (x, y, z), которая соответствует центру круга, и конечная точка (x2, y2, z2), которая соответствует поверхности сферы. У меня также есть много других конечных точек на поверхности сферы (например, x3, y3, z3), каждая из которых имеет одинаковую длину радиуса (rr).

Я хочу рассчитать угол перемещения от центральной точки (начало) до конечной точки и для всех остальных моих конечных точек. В конце концов, учитывая, скажем, 100 сфер, я хочу посмотреть, все ли конечные точки движутся с одинаковой направленностью / углами от центра. Для этой цели мне понадобится направление 0 и 360, чтобы «выглядеть одинаково», поэтому я думаю, что мне нужно использовать определенный тип конкретной плоскости.

Комментарий в конце этого поста (https://math.stackexchange.com/questions/707673/find-angle-in-degrees-from-one-point-to-another-in-2d-space) имеет хороший рисунок и ответ с использованием функции atan2, но это только для 2D-пространства.

Этот пост ( Угол между двумя трехмерными векторами с одним и тем же началом в одной плоскости ) и этот Угол между 3 точками в трехмерном пространстве заставил меня начать.

Это ( Угол X между двумя трехмерными векторами? ) также полезно, но вычисляет неправильный тип угла (я думаю) на основе горизонтальной системы.

Учитывая все это, вот что я придумала до сих пор. Вот несколько моментов:

a =  c(-0.0684486861, 0.0125857380, 0.0201056441) #start/center of sphere
b = c(-0.0650557851, 0.0175286346, -0.0228805516) #end point

v1 = c( (a[1] - b[1]), (a[2] - b[2]), (a[3] - b[3]) ) #vector

Тогда я думаю, что мне нужно вычислить скалярное произведение между v1 и, возможно, вектором, параллельным плоскости на 90 градусов от 2 точек? Чтобы потом взять косинус между углами? Но если радиус всегда один и тот же, не проще ли?

Я не знаю достаточно математики, чтобы понять это даже для набора из двух пунктов, и гораздо меньше, чтобы разработать код для этого для всех моих сфер / точек. Руководство с благодарностью.

1 Ответ

0 голосов
/ 18 апреля 2019

Термин «угол» не применим к направлению между двумя трехмерными точками.

Разница в точках D - вектор.Он характеризуется тремя составляющими (x, y, z).

Вы можете нормализовать это деление вектора на единицу d и представить это направление как косинус направления , где d.x = cos(angle between d and OX) и так далее.

Также трехмерное направление может быть представлено в сферической системе координат в виде угла theta между направлением и осью OZ и угла phi между проекцией направления на плоскость OXY и ось OX.

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


Если у вас есть радиус rr, центр сферы C=(xc,yc,yc), две точки на сфере P=(x1,y1,y1) и P2=(x2,y2,y2)тогда угол между направлениями от центра к этим точкам равен углу между векторами:

V1 = P1 - C
V2 = P2 - C

равно (с использованием точечного произведения и арккозина)

angle = acos( ((x1-cx)*(x2-cx) + (y1-cy)*(y2-cy) + (z1-cz)*(z2-cz)) / (rr*rr) )
...