2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 Умножение матрицы на нормаль
Сообщение17.03.2013, 13:09 
Аватара пользователя


30/07/12
22
Помогите разобраться плз, суть такая:

Есть 4 точки в пространстве (вершины прямоугольника). И есть нормализованный вектор, указывающий направление. Какие действия нужно выполнить, что-бы повернуть прямоугольник в доль нормали?

Код:
var normal:Point   = new Point(4, 2);
var p1:Point      = new Point(150, 150);
var p2:Point      = new Point(250, 150);
var p3:Point      = new Point(250, 250);
var p4:Point      = new Point(150, 250);

normalize(normal);
function normalize(vec:Point):void {
   var len:Number   = Math.sqrt(vec.x * vec.x + vec.y * vec.y);
   vec.x /= len;
   vec.y /= len;
}

 Профиль  
                  
 
 Re: Умножение матрицы на нормаль
Сообщение17.03.2013, 13:27 
Заслуженный участник


27/04/09
28128
Что значит «вдоль»? Повернуть его так, чтобы данный вектор (а зачем его нормализовать?) был в плоскости прямоугольника, можно не одним способом. Нужно, что-бы какая-то данная сторона была коллинеарна вектору, или всё-таки нужно, чтобы нормаль к плоскости прямоугольника была равна данному вектору?

Выбирайте, а то ведь совершенно неясно.

-- Вс мар 17, 2013 16:32:01 --

(Или доль это какое-то особое положение прямоугольника, зависящее от вектора? Не слышал такого термина.)

 Профиль  
                  
 
 Re: Умножение матрицы на нормаль
Сообщение17.03.2013, 14:41 
Аватара пользователя


30/07/12
22
Вот, изобразил задачу графически:
Изображение

То-есть, у прямоугольника есть исходные данные:
1. Положение центра в некоторой прямоугольной системе координат: x и y,
2. Координаты вершин этого прямоугольника, в этой системе. Для каждой из 4 точек: x и y

Задача состоит в том, что-бы получить новые координаты вершин, "повернув" прямоугольник вокруг его центра. Для поворота используется нормализованный вектор, указывающий угол поворота. (стрелочка внутри прямоугольника)

 Профиль  
                  
 
 Re: Умножение матрицы на нормаль
Сообщение17.03.2013, 15:51 
Заслуженный участник


27/04/09
28128
(Ой, я, кстати, сначала подумал, что задача трёхмерная, хотя координат везде ясно видно по две.)

Ага, значит, вам надо найти матрицу поворота вектора $(0, 1)$ в $\textrm{normal}$, а потом так же поворачивать все точки относительно центра прямоугольника.

Матрицу можно найти из уравнения $X \cdot \begin{bmatrix} 0 \\ 1 \end{bmatrix} = \textrm{normal}$, потом так же она действует для поворота точек вокруг $(0, 0)$: $Xa_\text{старая} = a_\text{новая}$.

Посмотрите, во что нужно эту операцию «обернуть», чтобы поворот был вокруг нужной точки.

-- Вс мар 17, 2013 18:53:37 --

Но из одного того уравнения матрицу вы не найдёте. Нужно знать, куда она переводит другой линейно независимый с первым вектор. Либо нужно знать, что матрица поворота имеет вид $\begin{bmatrix} a & b \\ -b & a \end{bmatrix}$.

-- Вс мар 17, 2013 18:55:08 --

Tails в сообщении #697005 писал(а):
1. Положение центра в некоторой прямоугольной системе координат: x и y,
Ну, это лишне засовывать в исходные данные, т. к. центр вычисляется из координат вершин.

 Профиль  
                  
 
 Re: Умножение матрицы на нормаль
Сообщение17.03.2013, 18:10 
Аватара пользователя


30/07/12
22
arseniiv,
Спасибо за то, что вы отозвались мне помочь. К сожалению, я не до конца вас понимаю, так-как плохо знаком с матрицами. Не могли бы вы объяснять так, что-бы вас понял даже младенец ?

В итоге, мне нужно получить координаты всего 4 точек, повернутых вокруг общего центра. Пусть для простоты, это будет центр 0, 0 в двумерной плоскости. У каждой из 4 точек, как я писал, есть свои координаты положения в пространстве.
Изображение

 Профиль  
                  
 
 Re: Умножение матрицы на нормаль
Сообщение17.03.2013, 18:39 
Заслуженный участник


27/04/09
28128
Tails в сообщении #697114 писал(а):
Не могли бы вы объяснять так, что-бы вас понял даже младенец ?
Так — точно не мог бы. Младенцы обычно плохо с математикой знакомы вообще.

Tails в сообщении #697114 писал(а):
Пусть для простоты, это будет центр 0, 0 в двумерной плоскости.
Для такой простоты уже всё есть.

У вас есть неизвестная (пока) матрица $A = \begin{bmatrix} a & b \\ -b & a \end{bmatrix}$ и есть уравнение $A \begin{bmatrix} 0 \\ 1 \end{bmatrix} = \begin{bmatrix} \mathrm{normal}_x \\ \mathrm{normal}_y \end{bmatrix}$, которое выливается в систему двух уравнений относительно неизвестных $(a, b)$. Вы их находите и, следовательно, находите матрицу $A$, потому что она зависит только от них. Так по каждому $\mathrm{normal}$ можно вычислить соответствующую $A$.

Это уравнение не с потолка взялось, оно показывает, что вертикально направленный вектор $(0, 1)$ поворачивается в ваш вектор $\mathrm{normal}$. У каждой точки на плоскости есть свой радиус-вектор, у которого те же координаты. Если поворачивается радиус-вектор точки, сама точка поворачивается вокруг начала координат. Умножаясь слева, матрица повернёт любой вектор, и, получается, любуюу точку вокруг начала координат. То есть повернуть те четыре точки прямоугольника вокруг $(0, 0)$ вы теперь, теоретически, можете.

Вам только осталось довести дело до конца:
arseniiv в сообщении #697045 писал(а):
Посмотрите, во что нужно эту операцию «обернуть», чтобы поворот был вокруг нужной точки.

 Профиль  
                  
 
 Re: Умножение матрицы на нормаль
Сообщение17.03.2013, 19:13 
Заслуженный участник


09/09/10
3729
arseniiv, что за ужасы вы рассказываете... Матрица поворота определяется одним углом, синусы-косинусы которого связан с координатами $\mathrm{normal}$ весьма просто. Так что надо прямоугольник сдвинуть к началу координат, повернуть вершины и сдвинуть обратно.

 Профиль  
                  
 
 Re: Умножение матрицы на нормаль
Сообщение17.03.2013, 19:16 
Заслуженный участник


27/04/09
28128
Косинусы-синусы ведь в этой задаче не необходимы. :roll: Я хотел сначала упомянуть однородные координаты, но решил помолчать вместе с неупоминанием о синусах. :?

-- Вс мар 17, 2013 22:22:54 --

Joker_vD в сообщении #697142 писал(а):
Матрица поворота определяется одним углом, синусы-косинусы которого связан с координатами $\mathrm{normal}$ весьма просто.
Ну так ведь без явного получения угла получится то же, что и при решении тех уравнений, разве нет?

(Оффтоп)

Кстати, а зачем матрица? Есть же такие славные комплексные числа… Я серьёзно — кватернионы и комплексные числа для поворота экономят и память, и время.

Joker_vD в сообщении #697142 писал(а):
Так что надо прямоугольник сдвинуть к началу координат, повернуть вершины и сдвинуть обратно.
Ну теперь этим мы выложили всё решение целиком. :-(

 Профиль  
                  
 
 Re: Умножение матрицы на нормаль
Сообщение17.03.2013, 19:25 
Заслуженный участник


09/09/10
3729
arseniiv
Разумеется, поскольку матрица поворота тут будет составлена из координат вектора $\mathrm{normal}$ — у него же единичная длина.

$$A=\left(\begin{array}{rr} \mathrm{normal}_y& \mathrm{normal}_x\\ -\mathrm{normal}_x&\mathrm{normal}_y \end{array}\right).$$

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

 Профиль  
                  
 
 Re: Умножение матрицы на нормаль
Сообщение17.03.2013, 19:27 
Заслуженный участник


27/04/09
28128
[Я там немного ещё дописал. :-) ]

 Профиль  
                  
 
 Re: Умножение матрицы на нормаль
Сообщение17.03.2013, 19:31 
Заслуженный участник


09/09/10
3729
Ну, мне просто с углами несколько проще себе это представлять. А почему матрицы... ну почему бы и нет. То, что матрицы особого вида изоморфны (гипер)комплексным числам — это, конечно, приятно для вычислителя, но не сильно принципиально для теоретика.

 Профиль  
                  
 
 Re: Умножение матрицы на нормаль
Сообщение17.03.2013, 19:39 
Заслуженный участник


27/04/09
28128
Я сам почему-то подумал, что ТС хотел с помощью матрицы, а на самом деле она упоминается только в заголовке темы.

 Профиль  
                  
 
 Re: Умножение матрицы на нормаль
Сообщение17.03.2013, 20:35 
Аватара пользователя


30/07/12
22
Joker_vD,
В каком порядке нужно произвести умножение координат вершин?

Так?
новый x вершины = x*normalY + x*normalX + x*(-normalX) + x*normalY
новый y вершины = y*normalY + y*normalX + y*(-normalX) + y*normalY

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

 Профиль  
                  
 
 Re: Умножение матрицы на нормаль
Сообщение17.03.2013, 20:46 
Заслуженный участник


27/04/09
28128
Для получения одного элемента результата надо умножить соответствующие строку левого множителя и столбец правого же.
$$\begin{bmatrix} a & b \\ c & d \end{bmatrix} \begin{bmatrix} x \\ y \end{bmatrix} = \begin{bmatrix} ax + by \\ cx + dy \end{bmatrix}.$$

 Профиль  
                  
 
 Re: Умножение матрицы на нормаль
Сообщение17.03.2013, 21:14 
Заслуженный участник


09/09/10
3729

(Оффтоп)

Цитата:
Вы, конечно, помните, как умножаются матрицы. Для того, чтобы получить элемент произведения матриц, стоящий в $i$–й строке и $j$–м столбце, нужно взять $i$–ю строку левой матрицы и $j$–й столбец правой матрицы. Последовательно каждый элемент $i$–ой строки левой матрицы умножается на соответствующий (то есть стоящий на такой же позиции от начала) элемент $j$–го столбца и полученные произведения элементов складываются. Полученное число и есть искомый элемент (о, ужас, только один), стоящий в $i$–й строке и $j$–м столбце произведения.


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

-- Вс мар 17, 2013 22:18:14 --

Tails в сообщении #697192 писал(а):
В начале я пробовал для каждой вершины сохранить сперва первоначальную дистанцию от вершины до центра. А затем умножить дистанцию на оси нормали, что-бы получить точку смещения, но видимо это был не верный вариант.

Ну давайте прикинем: пусть центр в $O(0,0)$, рассматриваем вершину $A(1,1)$, нормаль возьмем $(0,1)$ — т.е. отсутствие поворота. Расстояние $|OA|$ равно $\sqrt2$, "умножаем на оси нормали", получаем $(0,\sqrt2)$. Что дальше?

-- Вс мар 17, 2013 22:19:45 --

(Оффтоп)

И да, почему вы называете вектор, задающий поворот, "вектором нормали"? Он ни к чему не нормален.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 17 ]  На страницу 1, 2  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group