Компьютерная графика | |||||||
теория, алгоритмы, примеры на С++ и OpenGL | |||||||
2D теория | 3D теория | OpenGL | Обратная связь / Авторам | ||||
Мы vkontakte.ru ДрузьяСловарь синонимов русского языка |
Поворот плоскости и его матричное представлениеНиже речь пойдет о поворотах плоскости. С плоскостью все получается относительно несложно. Если мы делаем поворот относительно начала координат, то для задания вращения используется один угол (φ). Чтобы получить преобразование координат при повороте, возьмем произвольный вектор r, задающий некоторую точку. Его координаты:
При повороте на угол φ:
Т.о. при повороте на угол φ координаты x и y подвергаются преобразованию, написанному выше. Прим. Здесь фактически была использована полярная система координат. Матричное представление поворота плоскостиНаписанное выше
преобразование координат удобно представить в виде матрицы:
Какие
преимущества дает матричное представление? Заметим, что если умножить две
матрицы, задающие повороты на углы α и
β, то получится матрица поворота на угол α + β. Это легко проверить, перемножив
соответствующие матрицы и использовав формулы для косинуса и синуса суммы.
Программная реализацияСоздадим
программу, демонстрирующую приведенную выше теорию. Будем хранить текущий
поворот системы, как матрицу и каждый раз ''доворачивать'' систему на нужный
угол, используя умножение матриц. Для начала нам
понадобится инструментарий (framework) для
работы с матрицами:
matrix.cpp#include <math.h> void
SetRotationMatrix(double alpha, Matrix
&matrix) void
MultiplyMatrices(Matrix &dest, Matrix &left, Matrix &right) void
ApplyMatrixtoPoint(Matrix rot, _Point &point) matrix.h#include "geometry.h" typedef double Matrix[4]; void SetRotationMatrix(double alpha, Matrix
&matrix); Прим. Следует обратить ваше внимание на функцию MultiplyMatrices. Во многих случаях в роли dest и left
выступает одна и та же матрица. Поэтому, если сразу записывать в dest,
то получится некорректно.
Появляется модуль
geometry.h и тип ’’точка’’ (_Point): #ifndef _POINT Достаточно существенно меняется модуль draw.cpp. Ниже он приведен целиком. draw.cpp#include <windows.h> int Width,
Height; const int MARGIN = 10; void
InitRotation() draw.hvoid Draw(HDC
hdc); И наконец в
модуле main.cpp добавляется
обработчик WM_KEYPRESSED:
case WM_KEYDOWN:
Все! Теперь при
нажатии клавиш ← и → треугольник будет вращаться.
Прим. Несколько не разумно перерисовывать окно при нажатии любой клавиши. Но пока не будем заострять на этом внимание.
|