posts | comments
25Mar

Логічна система координат

No comments
« Введення Звязність Відсікання Перехід до віконних координат   |   Аффінноє перетворення і його матричне уявлення »

Вуаля! Отримуємо те, що потрібне. Слід відмітити, що X = T(X_Log) зростаюча функція, а Y = T(Y_Log) що убуває. Це показує різницю напрямів осей в логічній і віконній системах координат.

Прим. Переклад між системами координат, включає множення і роботу з числами з плаваючою крапкою. Тому робити такий перерахунок на кожен піксел зображення, що виводиться, не розумно. Про те, коли потрібно його робити я розповім пізніше, коли розмова піде про стадії роботи графічної програми.

Ось трикутник з попереднього уроку. Зберігши свої пропорції, він отримав деякі переваги.

Нижче приводиться новий код модуля draw.cpp:

#include

int Width, Height;

const int MARGIN = 10;

void SetWindowSize(int _Width, int _Height){

Width = _Width;

Height = _Height;

}

int Tx(double X_Log){

int X_Window;

X_Window = MARGIN + (1.0 / 2) * (X_Log + 1) * (Width - 2 * MARGIN);

return X_Window;

}

int Ty(double Y_Log){

int Y_Window;

Y_Window = MARGIN + (-1.0 / 2) * (Y_Log - 1) * (Height - 2 * MARGIN);

return Y_Window;

}

void Draw(HDC hdc){

MoveToEx(hdc, Tx(0.0), Ty(0.5), NULL);

LineTo(hdc, Tx(0.5), Ty(0.0));

LineTo(hdc, Tx(-0.5), Ty(-0.5));

LineTo(hdc, Tx(0.0), Ty(0.5));

}

В draw .h додається оголошення новій функції:

void Draw(HDC hdc);

void SetWindowSize(int _Width, int _Height);

В модуль main.cpp додаємо обробник події WM_SIZE і WM_ERASEBKGND :

case WM_SIZE:

GetClientRect(hWnd &Rect);

SetWindowSize(Rect.right - Rect.left, Rect.bottom - Rect.top);

break;

case WM_ERASEBKGND:


Tags: , , , , , , , ,

2D теорія


Схожі записи

Categories: 2D теорія

Wednesday, March 25th, 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.