Я рисую изометрическую карту с плиткой 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].
mathematics
algorithm
isometric
Алексан-Дверу
источник
источник
while(val = arr[i++])
или аналогичных конструкциях, не используйте его . Используйте++a
и++b
вместо.Ответы:
Вам необходимо определить матрицу преобразования из координат пространства листов в координаты пространства экрана, а затем рассчитать для этого обратную матрицу , которая при применении к координатам пространства экрана преобразует их в координаты пространства листов.
Особый случай
То, что вы в основном делаете для преобразования координат тайла-пространства (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 в примере), матрицы выглядят следующим образом.
Плитка пространство для экрана
Пространство экрана для пространства плитки
источник