LINUX.ORG.RU

Матрица вращения


0

0

есть 2 вектора: v1=[i,j,k] и v2=[a,b,c]. Оба длиной в единицу.
Как можно вичислить матрицу вращениа ис v1 вектора в v2 ?
Подскажите, а? или бросте в меня линком на ответ, пожалуйста. Очень надо.

П.С: я не лентай и это не домашнее задание.

anonymous

матрица однозначно твоими условиями не задается. Для вращения системы координат надо 3 угла, а не 2, как в твоем случае.

grustnoe ★★
()
Ответ на: комментарий от grustnoe

может имеется в виду вращение соответствующее кратчайшей дороге по сфере?? Тогда задается однозначно. Ну то есть вращение переводящее первый вектор во второй, и при этом оставляющее на месте их векторное произведение.

dilmah ★★★★★
()
Ответ на: комментарий от anonymous

anonymous (*) (06.10.2003 21:42:00): во первых я не программист, а химик и фармацевт и программирую не от хорошей жизни, так что извини за ламерство, но все досканально знать не могу.
dilmah: вот именно это я и имею в виду
в принципе, как я понимаю, зная угол между векторами остается найти ось [x,y,z] вращения т.е вектор перпендикулярный обеим моим векторам. я пытался решить это сам, но пришел к системе из трех уравнений :
x*x+y*y+z*z=1
ax+by+cz=0 //перпендикулярные векторы
ix+jy+kz=0 // ------||---------
У этой системы должны быть 2 (равнозначных для моей задачи) решения.
но что-то мне подсказывает, что можно это дело решить иначе, вот только как?




anonymous
()
Ответ на: комментарий от anonymous

> я не программист, а химик и фармацевт

При чём тут вообще программёж? Чистая математика. Ужколи пошла такая нехорошая жизнь -- учи мат. часть, иначе всё равно никак...

Эта штука, насколько я помню, называется векторное произведение.

x*y = определитель из трёх строк (i j k) (x1 x2 x3) (y1 y2 y3) = (x2y3-x3y2)i (x3y1-x1y3)j (x1y2-x2y1)k

Полученный вектор смотрит туда, откуда x поворачивается в y на минимальный угол против часовой стрелки. Его длина равна площади параллелограмма, построенного на двух векторах, иначе говоря, в твоём случае синус угла между ними.

Про матрицу как-то ничего пока в голову не лезет. Можно попробовать решать каждый раз уравнение... Хотя и правда должна быть матрица...

С уважением -- Смоляное Чучелко

anonymous
()

попробую написать простым языком. :)
пусть есть вектор w, |w|=1, вокруг которого надо на угол phi повернуть
пространство. Будем поворачивать некий вектор A;
у A есть две компонеты - вдоль w = (Aw)w, и поперечная A-(Aw)w
первая при преобразовании не меняется - возьмем ее за ось Z,
вторую возьмем за ось X, ось Y получим их векторным произведением
( [(Aw)w, A-(Aw)w]= (Aw)[A,w] )

Теперь у нас есть система координат
X - по вектору A-(Aw)w
Y - по вектору (Aw)[A,w]
Z - по вектору (Aw)w, фактически по w
базисные вектора можно получить нормировкой данных.

Вектор A в данной системе имеет только координаты x и z координаты
A=( A-(Aw)w ) + (Aw)w
Теперь поворачиваем систему на угол phi относительно Z.
Вектор (x,0,z) перейдет в (xcos(phi),xsin(phi),z)
То есть
A'= A_x*cos(phi)*e_x + A_x*sin(phi)*e_y + A_z*e_z
A'= (A-(Aw)w)cos(phi) + ((Aw)[A,w]/|(Aw)[A,w]|)*|(A-(Aw)w)|sin(phi) + (Aw)w

где
A_x, A_z - компоненты A по x и z, соотв. |(A-(Aw)w)| и (Aw)
e_x, e_y, e_z - реперные вектора
((Aw)[A,w]/|(Aw)[A,w]|) - это просто реперный вектор по Y

Да, это все работает в случае (Aw)>0, в противном случае мы повернемся на угол -phi (мне так кажется, но проверять лень)

grustnoe ★★
()
Ответ на: комментарий от grustnoe

> Да, это все работает в случае (Aw)>0

Ни фига подобного, имхо. Должно работать.

С уважением -- Смоляное Чучелко

anonymous
()

Во-первых спасибо за терпение и ответы.

Смоляное Чучелко: Мне действительно стыдно за свои плохие знания в математике и я собираюсь это дело исправить

grustnoe: в том-то и дело, что я не допендриваю относительно какой оси надо крутить исxодный вектор. Напомню: задача состоит в том что-бы из вектора v1 получить вектор v2 (|v1|==|v2|==1) путём вращения относительно точки [0,0,0], а не в том что-бы вращать вецтор относительно заданной оси.

anonymous
()

извини за тупость, но под [v1,v2] ты подразумеваешь векторное умножение двух векторов?

anonymous
()
Ответ на: комментарий от anonymous

да. кстати - можно рассуждения построить проще. В качестве оси x берем v1, в качестве y v1-(v1*v2)v2/|v2|^2, в качестве z - [v1,v2], ну - а дальше, как в предыдущем рассуждении...

grustnoe ★★
()

а если так
переходим в фсерическую с-му координат
берём разницу углов phi2-phi1 theta2-theta1 )

anonymous
()
Ответ на: комментарий от anonymous

> переходим в фсерическую с-му координат берём разницу углов phi2-phi1 theta2-theta1

"не читал, но осуждаю". Не помню точно, что есть сферическая система, но имею смутное подозрение, что так не выйдет...

Кстати, вертеть над именно вокруг векторного произведения.

С уважением -- Смоляное Чучелко

anonymous
()
Ответ на: комментарий от grustnoe

> В качестве оси x берем v1, в качестве y v1-(v1*v2)v2/|v2|^2, в качестве z - [v1,v2]

Точнее говоря, в качестве y v2-(v1v2)v1 / |v2-(v1v2)v1|.

С уважением -- Смоляное Чучелко

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.