Матрица вращения, которая минимизирует расстояние - PullRequest
4 голосов
/ 25 октября 2009

Допустим, у меня есть две точки в трехмерном пространстве (a и b) и фиксированный вектор оси / единицы, называемый n.

Я хочу создать матрицу вращения, которая минимизирует евклидово расстояние между точкой a (не повернутой) и повернутой точкой b.

Например:

 Q := matrix_from_axis_and_angle (n, alpha);

 find the unknown alpha that minimizes sqrt(|a - b*Q|)

Кстати: если решение / алгоритм проще выразить единичными кватернионами, используйте их. Я просто использовал матрицы для формулировки своего вопроса, потому что они более широко используются.


О - я знаю, что есть некоторые вырожденные случаи (a или b, лежащие точно в соответствии с сущностью). Их можно игнорировать. Я просто ищу случай, когда можно рассчитать одно решение.

Ответы [ 4 ]

5 голосов
/ 25 октября 2009

звучит довольно просто. Предположим, что единичный вектор n подразумевает поворот вокруг прямой, параллельной n через точку x0. Если x0! = Начало координат, переведите систему координат на -x0, чтобы получить точки a' и b' относительно начала координат новой системы координат 0, и используйте эти 2 точки вместо a и b.

1) рассчитать вектор ry = n x a

2) вычислить единичный вектор uy = единичный вектор в направлении ry

3) вычислить единичный вектор ux = uy x n

Теперь у вас есть триплет взаимно перпендикулярных единичных векторов ux, uy и n, которые образуют правую систему координат. Можно показать, что:

 a = dot(a,n) * n  +  dot(a,ux) * ux

Это потому, что единичный вектор uy параллелен ry, который перпендикулярен как a, так и n. (с шага 1)

4) Рассчитать компоненты b вдоль единичных векторов ux, uy. Компоненты a: (ax, 0), где ax = точка (a, ux). Компоненты b: (bx, by), где bx = точка (b, ux), by = точка (b, uy). Из-за правосторонней системы координат топор всегда положителен, поэтому вам не нужно его вычислять.

5) Рассчитайте тета = atan2 (by, bx).

Ваша матрица вращения - это та, которая вращается на угол-тета относительно системы координат (ux, uy, n) вокруг оси n.

Это дает вырожденные ответы, если a параллельно n (шаги 1 и 2) или если b параллельно n (шаги 4, 5).

2 голосов
/ 25 октября 2009

Пусть P - плоскость, перпендикулярная n. Мы можем найти проекцию a на P-плоскость (и аналогично для b):

a' = a - (dot(a,n)) n 
b' = b - (dot(b,n)) n 

где точка (a, n) - это произведение а и n

a 'и b' лежат в плоскости P.

Теперь мы уменьшили проблему до двух измерений. Ура!

Угол (вращения) между a 'и b' равен углу (вращения), необходимому для поворота b вокруг оси n так, чтобы он был ближе к a. (Подумайте о тенях, которые будут отбрасывать на плоскости Р).

Угол между a 'и b' легко найти:

dot(a',b') = |a'| * |b'| * cos(theta)

Решите для тета.

Теперь вы можете найти матрицу вращения, заданную тета и n здесь: http://en.wikipedia.org/wiki/Rotation_matrix

Джейсон С. справедливо указывает, что, узнав тэту, вы все равно должны решить повернуть b по часовой стрелке или против часовой стрелки вокруг оси n.

Величина dot ((a x b), n) будет положительной величиной, если (a x b) лежит в том же направлении, что и n, и отрицательной, если (a x b) лежит в противоположном направлении. (Он никогда не равен нулю, если ни a, ни b не коллинеарны с n.)

Если (a x b) лежит в том же направлении, что и n, то b необходимо повернуть по часовой стрелке на угол тета вокруг оси n.

Если (a x b) лежит в противоположном направлении, то b необходимо повернуть по часовой стрелке на угол -тета относительно оси n.

2 голосов
/ 25 октября 2009

Расстояние будет минимизировано, когда вектор от a до линии вдоль n совпадает с вектором от b до линии вдоль n.

Спроецируйте a и b в плоскость, перпендикулярную n, и решите задачу в двух измерениях. Вращение, которое вы получаете, - это вращение, необходимое для минимизации расстояния.

2 голосов
/ 25 октября 2009

Я думаю, вы можете перефразировать вопрос:

каково расстояние от точки до 2-го круга в трехмерном пространстве.

ответ можно найти здесь

поэтому необходимо выполнить следующие шаги:

  • вращение точки b вокруг вектора n дает двухмерный круг в трехмерном пространстве
  • , используя приведенное выше, найдите расстояние до этого круга (и точку на круге)
  • точка на окружности - это повернутая точка b, которую вы ищете.
  • Выведите угол поворота

... или что-то; ^)

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