Як перетворити координати миші в ізометричні індекси?


21

Я малюю ізометричну карту плиткою 64х32 :

const Offset = 160;
int X, Y;

for (int a=0; a < 6; a++)
  for (int b=0; b < 6; b++) {
    X = a * 32 - b * 32 + Offset;
    Y = a * 16 + b * 16;
    DrawTile(X, Y, tile);
  }

Зображення, що ілюструє цей код:

Зображення, що ілюструє цей код:

Шановні професіонали, будь ласка, допоможіть формулою перетворення координат миші в ізометричні показники клітини. Приклад: (105; 100) -> [1; 4].



Бічна примітка: Якщо ви насправді не хочете отримати доступ до попереднього значення змінної, яку ви збільшуєте, як у while(val = arr[i++])подібних конструкціях або подібних конструкціях, не використовуйте це . Використовуйте ++aі ++bзамість цього.
Мартін Сойка

Відповіді:


25

Вам потрібно визначити матрицю перетворення від координат простір-простір до координат простору екрана, а потім обчислити для цього зворотну матрицю , яка при застосуванні до координат екрану-простору перетворює їх на плиточно-просторові.

До речі: ваше зміщення насправді вказує на місце, яке було б (0,0, 1,0) у будь-якій розумній системі координат, але це не велика проблема, просто щось, про що слід пам’ятати. Це означає, що зміщення походження вашої трансформованої системи координат знаходиться у (Зсув + 32, 0).


Конкретний випадок

Що ви в основному робите для перетворення координат плитки-простору (a, b) в координати простору екрана (x, y), це запустити його через наступну матрицю перетворення:

введіть тут опис зображення

Визначення: a і b для плитки (0, 0) знаходяться в діапазоні [0,0, 1,0), причому (0,0, 0,0) є верхнім кутом, (1,0, 1,0) нижнім кутом, (0,0, 1,0) лівим кутом та (1,0, 0,0) правий кут у просторі екрану.

Ми розширюємо визначення координат на постійну третю координату (завжди це точно 1), щоб мати можливість включити переклад у матрицю.

Тепер ви можете створити зворотну матрицю для цього перетворення. Основна формула:

введіть тут опис зображення

... з C є матрицею кофакторов для A .

У вашому випадку визначальний | А | завжди 1024, незалежно від зміщення, тому обернена матриця:

введіть тут опис зображення


Приклад розрахунку

Тепер для ваших прикладних даних ...

Введіть у формулу свій номер для компенсації, і ви отримаєте:

введіть тут опис зображення

Перемноживши (105, 100, 1) (координати екрану) на матрицю, ви отримаєте:

введіть тут опис зображення введіть тут опис зображення

Оскільки третя координата завжди дорівнює 1, нам не потрібно її обчислювати. Закруглете до найближчого цілого числа, і ви отримаєте (1, 4) як ваш координатний простір плитки, як очікувалося.


Загальні диметричні матриці проекції

Якщо у вас є така перспектива, коли кожна плитка має ширину 2 w (64 у прикладі, так w = 32) і 2 год висоти (32 у прикладі, так h = 16), і зміщення точки початку у просторі екрану f x та f y для горизонтальної та вертикальної осі відповідно (192 та 0 у прикладі) матриці виглядають так.

Плитка місця для екрану

введіть тут опис зображення

Простір екрану, щоб простір плитки

введіть тут опис зображення

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.