posts | comments
28Mar

Поворот площини за допомогою миші

No comments
« Математичне завдання прямій на площині   |   Вектори в просторі Однорідні координати Матриці перетворень »


MultiplyMatrices(CurrentMatrix, CurrentMatrix, Rot);

old_mouse = new_mouse;

}

Суть цього класу в тому, що він запам’ятовує дії миші. У кожен момент часу є матриця, яка відповідає за поточний стан системи (поворот).

  • конструктор Rotation() ініціалізував матрицю як одиничну
  • void InitRotation(int x, int у): при натисненні миші ми запам’ятовуємо поточний вектор, вказуючий напрям на точку натиснення. Цей вектор нормалізований (unit()).
  • void Rotate(int x, int у): при русі отримуємо вектор, вказуючий на поточне положення миші. За допомогою векторних операцій отримуємо тригонометричні функції кута між цим вектором і вектором, що відповідає за попереднє положення миші. Умножаємо поточну матрицю CurrentMatrix на матрицю повороту, визначувану отриманим синусом і косинусом.

В модуль matrix.cpp додається нова функція:

void SetRotationMatrixbySinCos(double sinalpha, double cosalpha, Matrix &matrix)

{

matrix[0]= cosalpha;

matrix[1]= -sinalpha;

matrix[2]= sinalpha;

matrix[3]= cosalpha;

}

Подивимося на зміни у файлі draw.cpp:

  • з’являється нова змінна, що відповідає за клас Rotation:

Rotation *Ball;

  • За допомогою функції SetBall встановлюється поточний обробник обертань:

void SetBall(Rotation *_Ball)

{

Ball = _Ball;

}

  • До всіх крапок застосовується перетворення, але тепер воно береться з класу Ball:

ApplyMatrixtoPoint(Ball->CurrentMatrix, triangle[i]);

І нарешті, додається обробник миші в основний файл main.cpp:

case WM_LBUTTONDOWN:

Ball->InitRotation(LOWORD(lParam) - Rect.right / 2, HIWORD(lParam) - Rect.bottom / 2);

InvalidateRect(hWnd, NULL, FALSE);

break;

case WM_MOUSEMOVE:


Tags: , , , , , , , ,

2D теорія


Схожі записи

Categories: 2D теорія

Saturday, March 28th, 2009 at 09:15 and is filed under 2D теорія. You can follow any responses to this entry through the feed. Both comments and pings are currently closed.