Javascript угол между двумя векторами

Рассчитать угол между двумя трехмерными векторами

Примечание: я абсолютно не имею понятия о математике, особенно в 3D.

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

Leap Motion предоставляет нам API, который дает нам объект для рук, пальцев и костей. В частности, кости имеют несколько свойств, таких как векторы положения, векторы направления и т. Д., См. Здесь документацию.

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

var a = hand.indexFinger.distal.direction(); var b = hand.indexFinger.proximal.direction(); var dot = Leap.vec3.dot(a,b); var degree = Math.acos(dot)*180/Math.PI; 

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

Например, когда все мои Пальцы вытянуты, значение степени примерно равно 0 и колеблется от -5 до 5. Когда я делаю кулак, значение возрастает до 10, 15, 20. Регистрация значений направления Векторы показывает что они действительно меняются, но как это имеет смысл? Палец не двигается, поэтому его направление должно оставаться прежним.

Еще хуже для большого пальца, значения не складываются там вообще. Удлиненный большой палец может получить значения, подобные IndexFinger, но при повороте большого пальца вверх или вниз изменяется в пределах 60 градусов!

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

Читайте также:  Javascript заменить найденную строку

Итак, мой вопрос: как я могу надежно рассчитать угол между двумя векторами? Что мне здесь не хватает?

Источник

Как найти угол между двумя векторами на холсте?

Мне нужно найти угол между двумя векторами на холсте. Я приложил несколько примеров ниже:

Не могли бы вы посоветовать мне формулу? У меня проблемы со школьной математикой:)

4 ответа

По сути, вам нужно сделать точку, которая соединяет ваши два вектора, источником, где x=0 и y=0.

Посмотрите на эту картинку:

Теперь мы можем сказать, что значения x и y точек A, B и C:

Чтобы вычислить арктангенс обоих, мы можем использовать функцию Math.atan2(). Обратите внимание, что первым параметром для atan2 должно быть значение y.

var firstAngle = Math.atan2(-6, 0); var secondAngle = Math.atan2(2, 5); 

и получи их разницу вычитанием

var angle = secondAngle - firstAngle; 

Это вернет значение в радианах, которое вы можете преобразовать в градусы следующим образом:

angle = angle * 180 / Math.PI; 

Сначала вам нужно нормализовать два вектора.

Как только это будет сделано, вы можете сделать

где «угол» — это угол, который вы хотите найти, «аркос» — обратная функция косинуса, а «•» — оператор точечного произведения.

Будьте осторожны, это вернет только относительный и необработанный угол. Вы не сможете узнать, какой вектор находится слева, а какой — справа.

Если вам нужен 2D ( z=0 ) и поддержку 3D , вы можете использовать

const dot = (p1, p2) => p1.x * p2.x + p1.y * p2.y + p1.z * p2.z; 

С квадратной величиной ( magSq ), мы можем вычислить величину: mag = Math.sqrt(magSq)

const magSq = () => x ** 2 + y ** 2 + z ** 2; const mag = Math.sqrt(magSq(p)); 

Теперь мы можем вычислить продукт Dotточечное произведение и затем «нормализовать» его. Теперь используйте acos() чтобы получить угол:

const angle = Math.acos(dot(p1, p2) / Math.sqrt(magSq(p1) * magSq(p2))); 

Мы также могли бы использовать Math.hypot() , специальная функция JS для mag :

const mag = (p) => Math.hypot(p.x, p.y, p.z); 
const angle = Math.acos(dot(p1, p2) / (mag(p1) * mag(p2))); 

Пример:

Старый вопрос. Но я нашел хорошее решение. Допустим, у нас есть 4 точки, формирующие 2 вектора. точек (P0, P1, P2, P3), то угол P0P1 и P2P3 равен:

function angle2Vectors(ps) < const v1 = < x: ps[1].x - ps[0].x, y: ps[1].y - ps[0].y >; const v2 = < x: ps[3].x - ps[2].x, y: ps[3].y - ps[2].y >; const l1_l2 = len(ps[1], ps[0]) * len(ps[3], ps[2]); const v1_v2 = v1.x * v2.x + v1.y * v2.y; const cos = v1_v2 / (len(ps[1], ps[0]) * len(ps[3], ps[2])); const angCos = Math.acos(cos) * (180 / Math.PI); const _v1_v2_ = v1.x * v2.y - v2.x * v1.y; const sin = _v1_v2_ / l1_l2; const angSin = Math.asin(sin) * (180 / Math.PI); return angCos * Math.sign(angSin); > 

Источник

Читайте также:  Php удалить символ переноса строки

Как найти угол между двумя векторами на холсте?

Мне нужно найти угол между двумя векторами на холсте. Я приложил несколько примеров ниже:

enter image description here

Не могли бы вы посоветовать мне формулу? У меня проблемы со школьной математикой 🙂

2 ответа

По сути, вам нужно сделать точку, которая соединяет ваши два вектора, источником, где x = 0 и y = 0.

Взгляните на эту картинку:

Теперь мы можем сказать, что значения x и y точек A , B и C :

Чтобы вычислить арктангенс обоих, мы можем использовать функцию Math.atan2 () . Обратите внимание, что первым параметром для atan2 должно быть значение y.

var firstAngle = Math.atan2(-6, 0); var secondAngle = Math.atan2(2, 5); 

И получи их разницу вычитанием

var angle = secondAngle - firstAngle; 

Это вернет значение в радианах, которое вы можете преобразовать в градусы следующим образом:

angle = angle * 180 / Math.PI; 

Сначала вам нужно нормализовать два вектора.

Как только это будет сделано, вы можете сделать

Где «угол» — это угол, который вы хотите найти, «аркос» — обратная функция косинуса, а «•» — оператор точечного произведения.

Будьте осторожны, это вернет только относительный и необработанный угол. Вы не сможете узнать, какой вектор находится слева, а какой — справа.

Источник

Вычислить угол между двумя 3D-векторами

Примечание. Я совершенно не разбираюсь в векторной математике, особенно в 3D. В настоящее время я работаю над некоторым кодом Javascript, который определяет, является ли палец, захваченный контроллером движения Leap, расширенным (то есть полностью прямым) или нет. Leap Motion предоставляет нам API, который дает нам Object for Hands, Fingers and Bones. Кости, в частности, имеют несколько свойств, таких как векторы положения, векторы направления и т. д., см. здесь для документации. Моя идея заключалась в том, чтобы взять дистальную фалангу (кончик пальца) и проксимальную фалангу (первая кость пальца), вычислить угол между ними, получив скалярное произведение векторов двух направлений костей, а затем решить, прямой ли он. или нет. Вот так, по сути:

var a = hand.indexFinger.distal.direction(); var b = hand.indexFinger.proximal.direction(); var dot = Leap.vec3.dot(a,b); var degree = Math.acos(dot)*180/Math.PI; 

Проблема здесь в том, что эти значения ненадежны, особенно если двигаются другие пальцы. Кажется, что направления векторов костей меняются, когда другие пальцы меняют направление (. ). Например, когда все мои пальцы вытянуты, значение степени равно примерно 0 и колеблется между -5 и 5. Когда я сжимаю кулак, значение увеличивается до 10, 15, 20. Регистрация значений векторов направления показывает что они действительно меняются, но какой в ​​этом смысл? Палец не двигается, поэтому его направление должно оставаться прежним. Что еще хуже для большого пальца, значения там вообще не складываются. Вытянутый большой палец может принимать значения, аналогичные IndexFinger, но поворот большого пальца вверх или вниз имеет изменения в диапазоне 60 градусов! Вместо этого я попытался использовать позиционные значения, что дает мне результаты NaN, потому что значения кажутся слишком большими. Итак, мой вопрос: как я могу надежно рассчитать угол между двумя векторами? Что мне здесь не хватает?

Читайте также:  Svg css stop color

Источник

Оцените статью