Ближайшие соседи с использованием кватернионов

Учитывая значение кватерниона, я хотел бы найти его ближайшего соседа в наборе кватернионов. Для этого мне явно нужен способ сравнить «расстояние» между двумя кватернионами. Какое представление расстояния необходимо для такого сравнения и как оно вычисляется?

Спасибо,

Джош


person Josh    schedule 07.02.2011    source источник


Ответы (4)


Является ли ваш кватернион просто точкой в ​​трехмерном пространстве с ориентацией?

Тогда расстояние между двумя кватернионами x1,y1,z1,w1 и x2,y2,x2,w2 определяется как:

distance = sqrt((x1-x2)^2 + (y1-y2)^2 + (z1-z2)^2), предполагая, что компонент w используется для ориентации. т.е. это то же самое, что и расстояние между двумя точками 3D.

Является ли ваш кватернион точкой в ​​4D-пространстве?

Тогда расстояние между ними определяется как:

distance = sqrt((x1-x2)^2 + (y1-y2)^2 + (z1-z2)^2 + (w1-w2)^2).

Это просто расширение 4D пространства. Эта формула евклидова расстояния работает в любом количестве измерений.

person Olhovsky    schedule 07.02.2011
comment
Спасибо за ответ. Кватернионы представлены в виде точки в четырехмерном пространстве. Я использовал евклидово расстояние, как было предложено, и оно дает разумные результаты. - person Josh; 08.02.2011
comment
Нашел лишнюю скобку в вашей второй формуле, но не могу внести изменения, так как в ней меньше 6 символов. Должно быть distance = sqrt((x1-x2)^2 + (y1-y2)^2 + (z1-z2)^2 + (w1-w2)^2). Спасибо за этот ответ! - person Scott Thiessen; 18.03.2016

Это старый вопрос, но, похоже, ему нужно немного больше ответа. Если кватернионы представляют собой кватернионы единичной длины, используемые для представления вращений, то евклидово расстояние даст некоторые забавные результаты, потому что кватернионы обеспечивают двукратное избыточное представление пространства вращения; т. е. кватернион и его отрицание представляют одну и ту же ориентацию. В этом случае правильной метрикой расстояния является угол между кватернионами, ограниченный [0,pi/2]:

theta = acos(q1.w*q2.w + q1.x*q2.x + q1.y*q2.y + q1.z*q2.z);
if (theta>pi/2) theta = pi - theta;
person JCooper    schedule 25.04.2011

Это действительно зависит от того, для чего вы используете свои кватернионы. Простая мера расстояния будет абсолютной величиной их разности.

If x = a + b i + c j + d k y = e + f i + g j + h k

чем евклидово расстояние

 |x-y| = sqrt( (a-e)² + (b-f)² + (c-g)² + (d-h)² )
person Paŭlo Ebermann    schedule 07.02.2011

Если «расстояние» вы имеете в виду кратчайшее вращение дуги между двумя ориентациями, тогда простое евклидово расстояние в порядке (L2 или norm2).

потому что угол между ориентациями может быть записан как

theta = acos(q1.w*q2.w + q1.x*q2.x + q1.y*q2.y + q1.z*q2.z);

Чем больше L2, тем больше расстояние.

ПРИМЕЧАНИЕ. Все кватернионы перед запросом должны быть инвертированы, если они обеспечивают отрицательное скалярное произведение. Затем вы можете использовать обычное совпадение KNN для ускорения ваших запросов.

person minorlogic    schedule 26.03.2014