Как получить изометрические индексы ячеек от координаты мыши?

Я рисую изометрическую карту с плиткой 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);
 }

Изображение, иллюстрирующее этот код: http://i.imgur.com/tgCxF.png

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

Благодарю.

PS Прошу прощения за мой плохой английский. Я только учусь...

1 ответ

Решение

У вас есть два базисных вектора p=(32,16) и q=(-32,16). Любой вектор r является линейной комбинацией p и q:

r = a * p + b * q
components:
rx = a * 32 - b * 32 = (a - b) * 32
ry = a * 16 + b * 16 = (a + b) * 16
so your indexes are:
a = (2 * ry  + rx) div 64
b = (2 * ry  - rx) div 64
(div is integer division)

Добавлено: обратите внимание, что я использовал среднюю верхнюю точку в качестве нулевой координаты и учел ваше смещение

Другие вопросы по тегам