Угол между двумя векторами в Matlab - PullRequest
0 голосов
/ 02 декабря 2010

У меня есть две точки, a и b. Мне нужно вычислить угол между ними, поэтому я отношусь к ним как к векторам. Однако вектор a всегда будет определяться как [0 0 0]. Читая через MATLAB Newsreader, « Угол между двумя векторами », предоставляются три решения:

x1 = 0;
y1 = 0;
z1 = 0;
x2 = 0;
y2 = 1;
z2 = 0;
a = [x1,y1,z1]; b= [x2,y2,z2];

theta = rad2deg(atan2(norm(cross(a,b)),dot(a,b)))
theta = rad2deg(acos(dot(a,b)))
theta = rad2deg(atan2(x1*y2-x2*y1,x1*x2+y1*y2)) 

Однако, поскольку acos имеет проблемы с точностью, поскольку тета приближается к нулю, из всех трех уравнений только acos дает правильное решение.

Стоит ли продолжать использовать acos или есть лучшее решение?

Ответы [ 2 ]

4 голосов
/ 02 декабря 2010

A вектор имеет величину и направление, в то время как a и b являются просто точками координат в пространстве. Когда вы обрабатываете a и b как векторы, вы неявно определяете [0 0 0] как исходную точку для двух векторов. Однако, поскольку точка a находится на [0 0 0], это будет вектор с нулевой длиной.

Если вектор имеет нулевую длину, в каком направлении он указывает? Ответ никуда. Он не указывает ни в каком направлении, и поэтому вы не можете найти угол между ним и другим вектором.

Я думаю, возможно, вы плохо определили свою проблему. Ваша система координат имеет начало координат, отличное от [0 0 0]? Вы на самом деле пытаетесь найти угол между линией, образованной a и b, и плоскостью x-y?

0 голосов
/ 02 декабря 2010

Ошибка установки a = [0 0 0].Точка интереса центрируется в начале координат, и для вычисления угла относительно вектора b необходимо указать направление движения точки.Это можно сделать, установив a как единичный вектор.

Если точка движется в направлении "x", то x1=1

x1 = 1;
y1 = 0;
z1 = 0;
x2 = 0;
y2 = 1;
z2 = 0;
a = [x1,y1,z1]; b= [x2,y2,z2];

theta = rad2deg(atan2(norm(cross(a,b)),dot(a,b)))
theta = rad2deg(acos(dot(a,b)))
theta = rad2deg(atan2(x1*y2-x2*y1,x1*x2+y1*y2))

theta =
    90
theta =
    90
theta =
    90

Проблема решена, забудьтеиспользуйте единичный вектор: P

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