Как преобразовать координаты мыши в изометрические индексы?

21

Я рисую изометрическую карту с плиткой 64x32 :

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 .

В вашем случае определитель | A | всегда 1024, независимо от смещения, поэтому обратная матрица:

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


Пример расчета

Теперь для вашего примера данных ...

Поместите свой номер для смещения в формулу, и вы получите:

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

Умножение (105, 100, 1) (экранные координаты) на матрицу дает вам:

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

Поскольку третья координата всегда равна 1, нам не нужно ее вычислять. Округление до ближайшего целого числа, и вы получите (1, 4) в качестве ваших координат пространства плитки, как и ожидалось.


Общие диметрические проекционные матрицы

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

Плитка пространство для экрана

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

Пространство экрана для пространства плитки

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

Мартин Сойка
источник