LINUX.ORG.RU

ротация точек в пространстве


0

0

[Тут, может год назад, пробегал похожий вопрос, так что кто знает, помогите, пожалуйста.]

Имеем треугольник с вершинами A[0;0;0], B[Xb;0;0], C[Xc,Yx,0]. Треугольник повернули в округ оси [i;j;k] ((i^2+j^2+k^2)==1) на alpha градусов (или радианов) и теперешние его координаты: A'[0;0;0], B'[Xb'Yb'Zb'], C[Xc'Yc'Zc']. Как из этой информации можно восстановить ось вращения ([i,j,k]) и угол alpha?

Заранее спасибо.

P.S Пожалуйста не гоните меня учить матчасть: формального образования по математике у меня практически нету. Хотя это было-бы и полезно, но неделю на вникание в алгебру, только для решения этой задачи, мне немножко жалко.

★★

> формального образования по математике у меня практически нету.

Вникнуть в математику никогда не жалко а очень даже полезно.

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

Это верно, вот только времени хронически не хватает. Может быть в следующем учебном году пойду в универ слушать "введение в линеарную алгебру"....

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

ищи формулы эйлера (не, немного не то).
через кватернионы можно вывести.
ща для твоего частного случая гляну.

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

придумал - смотри, если O - вектор поворота
(величина - alpha (mod 2pi) то R'=OxR (вект. произв.).
дальше решаешь линейную систему.

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

а вообще я давно заметил что сисадмы и прогеры плохо шарят в матфизе.
хотя некоторые и быстро ксорят дворды ;).

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

это нелинейная задача:
X'=AX (1)
A=X'X_t(XX_t)^(-1) (2) , X_t это X транспонированная.
a_{ij}=\delta_{ij}(e_0^2 - e_k e_k) + 2e_i e_j + 2\eps_{ijk} e_0 e_k;
ось вращения направлена по (e_1, e_2, e_3), угол поворота
cos(fi)= e_0^2 - e_1^2 - e_2^2 - e_3^2.

итого: матриуц поворота А ты найдешь см. (2)
ее компоненты - нелинейны по e_i. зная e_i ты получаешь решение.
короче нужно решать нелинейную систему...

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

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

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

__Линейную алгебру__



x = (x_1, 0, 0) -> (x'_1, x'_1, x'_1)
y = (y_1,y_2, 0) -> (y'_1, y'_2, y'_3)

Для начала находим матрицу поворота, для этого, найдем, куда перейдет вектор z = (0,0,1).

Для этого воспользуемся тем, что перпенидкулярен x и y. То есть нужно решить систему уравнений

x'_1 * z'_1 + x'_2* z'_2+ x'_3 * z'_3 =0
y'_1 * z'_1 + y'_2* z'_2+ y'_3 * z'_3 =0

Заметим, что длина полученного вектора равна 1, то есть z'_1^2+z'_2^2 + z'_3^2 =1, а направлен
он таким образом, чтобы знак определителя из векторов 
(x'_1, x'_2, x'_2)
(y'_1, y'_2, y'_2)
(z'_1, z'_2, z'_2)

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

(x_1, 0, 0)
(y_1, y_2, 0)
(0, 0, 1)

После этого мы можем выписать матрицу перехода:

(x'_1/x_1, x'_2/x_1, x'_3/x_1)

((y'_1 - x'_1 * y_1/x_1)/y_2, 
(y'_1 - x'_1 * y_1/x_1)/y_2, (y'_1 - x'_1 * y_1/x_1)/y_2 )

(z'_1, z'_2, z'_3)

После этого найдем у нее собственный вектор, это и будет (i,j,k)
Во время нахождения собственного вектора можно будет решить характеристическое уравнение, и найти
его комплексные корни, они и дадут угол поворота.

Вот так, без математики не обойдешься.

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

Извиняюсь, все книги по математике к которым у меня есть доступ написаны на англицком. Поэтому хотел бы уточнить: собственный вектор - это как я понимаю eigen vector, а комплексные корни - "eigenvalues". Надеюсь, что я прав, но если нет - поправте, пожалуйста

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

> anonymous (*) (27.01.2004 19:08:47)

Чё-то ты нагнал, дружище. Какие, нафиг, комплексные собственные значения? Это ж геометрия.

Вот решение в лоб. Чисто аналит-геометрическое. :) [a,b] обозначает векторное произведение векторов a и b; a*b - скалярное; norm(a) - нормированный вектор a.

Вектор x=BB', y=CC'. z'=norm([x,y]). z'=(z'_1, z'_2, z'_3) - это и будет твой (i,j,k).

Теперь находим угол. Пусть x' - такой вектор, что прямая с направляющим вектором x', проходящая через т. B _пересекает_ прямую (i,j,k) под прямым углом. y' - аналогично, но для точки B'. Тогда их можно найти так:

Находим a (скаляр) такое, что:

(B_1-a*z'_1)*z'_1 + (B_2-a*z'_2)*z'_2 + (B_3-a*z'_3)*z'_3 = 0

Тогда x'=norm((B_1-a*z'_1, B_2-a*z'_2, B_3-a*z'_3)). Аналогично для y', только с точкой B'.

Далее, cos(alpha) = x'*y', sin(alpha) = abs([x',y']).

P.S. Тут не учтены всякие гадости, которы могут приключиться в общем случае, и требуют отдельного рассмотрения. Например, если BB'||CC'.

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


>P.S. Тут не учтены всякие гадости, которы могут приключиться в >общем случае, и требуют отдельного рассмотрения. Например, если >BB'||CC'.

Вот именно.

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

Rock: а если исходные точки не лежат в [0;0;0], [х;0;0], [х1;у1;0] (более общий случай), катят ли тогда твои вычесления?

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

Rock: спасибо, работает, как зверь

>P.S. Тут не учтены всякие гадости, которы могут приключиться в
> <snip> Например, если >BB'||CC'

Это очень маловероятно, так что пока оставлю как есть. будет мешать - напишу по аналогии функции для "гадких" случаев (приходят на ум три: BB'||CC' - поворот вокруг оси Z, |BB'|==0, |CC'|==0.
В крайнем случае прибегну к линейной алгебре.

Опять спасибо .

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

> функции для "гадких" случаев (приходят на ум три: BB'||CC' - поворот вокруг оси Z, |BB'|==0, |CC'|==0

А что с поворотом вокруг оси Z?

> а если исходные точки не лежат в [0;0;0], [х;0;0], [х1;у1;0] (более общий случай), катят ли тогда твои вычесления?

Да.

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

>> функции для "гадких" случаев (приходят на ум три: BB'||CC' - >>п Z, |BB'|==0, |CC'|==0
>А что с поворотом вокруг оси Z?
sorry имел в виду что BB''||CC' - при повороте вокруг оси _Y_ (s/Z/Y/)

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

>> А что с поворотом вокруг оси Z?
> sorry имел в виду что BB''||CC' - при повороте вокруг оси _Y_
А чем ось Y в данном случае принципиально отличается от Z?

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

а ни чем. просто при заданной мной задаче (B на оси X и C на плоскости XY) при повороте вокруг Y получаем BB'||CC'

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

да, шаришь, только все же лучше искать матрицу поворота по
формуле 2.

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

> просто при заданной мной задаче (B на оси X и C на плоскости XY) при повороте вокруг Y получаем BB'||CC'

Тогда уж и ось X в отдельный случай выделить :) BB'==0

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