Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.10.02;
Скачать: CL | DM;

Вниз

Вращение вокруг точки   Найти похожие ветки 

 
Rel_   (2003-06-05 17:04) [0]

Народ, кто сталкивался, подскажите:

Есть массив точек. A: array of TPoint.
Его необходимо поворачивать вокруг точки B : TPoint, например на угол "x" по таймеру и отрисовывать в виде полигона.

После поворота координаты точек должны сохраняться в исходном массиве A и новые координаты пересчитываются уже на их основе.
На экране должно наблюдаться вращение полигона вокруг заданной точки.

Как энто сделать???


 
Axis_of_Evil ©   (2003-06-05 17:14) [1]

Удалено модератором


 
VMcL ©   (2003-06-05 19:33) [2]

>Rel_ (05.06.03 17:04)

Загляни в справочник по математике: "Поворот координат".


 
Sheng ©   (2003-06-06 00:21) [3]

Умножить на матрицу поворота!


Главная матрица перемещений
----------------------------------
Главной матрицей перемещений будем называть такую матрицу, в которой x_translation и y_translation - это коэффициенты перемещения объекта по осям X и Y. Вот как она выглядит:
¦ ¦
¦1 0 0¦
¦0 1 0¦
¦x_translation y_translation 1¦
¦ ¦


Главная матрица масштабирования
--------------------------------------
Главная матрица масштабирования - это такая матрица, в которой scale_x и scale_y - это коэффициенты масштабирования объекта по координатам x и y:

¦scale_x 0 0¦
¦0 scale_y 0¦
¦0 0 1¦

Такая матрица позволяет выполнять неоднородное масштабирование - мы можем задать один масштаб по оси X и другой - по оси Y. Таким образом, если мы хотим масштабировать объект однородно, то должны задать scale_x = scale_y.

- 107 -
Главная матрица поворотов
-------------------------------
В главной матрице поворотов angle - это угол, на который вы хотите повернуть объект:
¦cos(angle) -sin(angle) 0¦
¦sin(angle) cos(angle) 0¦
¦0 0 1¦


Общая матрица масштабирования, поворотов и перемещений
----------------------------------------------------------
Наступает торжественный момент. Теперь мы возьмем матрицы перемещения, масштабирования и поворота и перемножим их (получим их конкатенацию), чтобы получить общую матрицу, реализующую все три функции сразу. Окончательно матрица будер выглядеть так:

¦scale_x x cos(angle) scale_x x -sin(angle) 0¦
¦scale_y x sin(angle) ( angle) Умножить на матрицу поворота!


Главная матрица перемещений
----------------------------------
Главной матрицей перемещений будем называть такую матрицу, в которой x_translation и y_translation - это коэффициенты перемещения объекта по осям X и Y. Вот как она выглядит:
¦ ¦
¦1 0 0¦
¦0 1 0¦
¦x_translation y_translation 1¦
¦ ¦


Главная матрица масштабирования
--------------------------------------
Главная матрица масштабирования - это такая матрица, в которой scale_x и scale_y - это коэффициенты масштабирования объекта по координатам x и y:

¦scale_x 0 0¦
¦0 scale_y 0¦
¦0 0 1¦

Такая матрица позволяет выполнять неоднородное масштабирование - мы можем задать один масштаб по оси X и другой - по оси Y. Таким образом, если мы хотим масштабировать объект однородно, то должны задать scale_x = scale_y.

- 107 -
Главная матрица поворотов
-------------------------------
В главной матрице поворотов angle - это угол, на который вы хотите повернуть объект:
¦cos(angle) -sin(angle) 0¦
¦sin(angle) cos(angle) 0¦
¦0 0 1¦


Общая матрица масштабирования, поворотов и перемещений
----------------------------------------------------------
Наступает торжественный момент. Теперь мы возьмем матрицы перемещения, масштабирования и поворота и перемножим их (получим их конкатенацию), чтобы получить общую матрицу, реализующую все три функции сразу. Окончательно матрица будер выглядеть так:

¦scale_x x cos(angle) scale_x x -sin(angle) 0¦
¦scale_y x sin(angle) scale_y x cos(angle) 0¦
¦x_translation y_translation 1¦

Если вы теперь умножите вершины объекта на эту матрицу, то получите перемещенный, повернутый и масштабированный объект.


 
Sheng ©   (2003-06-06 00:23) [4]

Круто, а?


 
Думкин ©   (2003-06-06 05:39) [5]

При данной постановке задачи - матрица поворота не меняется.
Меняются координаты точек.
Остальное как и описано.


 
Rel_   (2003-06-06 08:53) [6]

Спасибо огромное.

to Axis_of_Evil © - вот только ругаться не надо было. Я впервой с энтим столкнулся - знал что сущ-ет абсолютно стандартное решение - вот и спросил.



Страницы: 1 вся ветка

Текущий архив: 2003.10.02;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.016 c
14-4037
wl
2003-09-16 12:56
2003.10.02
Siemens A55 -> C55


1-3973
Evg12
2003-09-19 13:02
2003.10.02
Обработка Нажатия Escape


1-3949
Anderz
2003-09-20 22:12
2003.10.02
Проектирование


4-4171
Unknown user
2003-07-30 18:49
2003.10.02
Как создать DIB?


3-3781
Plt
2003-09-11 13:08
2003.10.02
Interbase