Экранные координаты в изометрические координаты

Я борюсь за преобразование координат мыши / экрана в индекс изометрической плитки. Я пробовал все формулы, которые я мог найти здесь или в Интернете, но ни одна из них, кажется, не работает, или я что-то упускаю. http://i.imgur.com/HnKpYmG.png Вот изображение, начало координат в верхнем левом углу и размеры одной плитки 128x64 пикселей.

Буду признателен за любую помощь, спасибо.

2 ответа

Решение

По сути, вам нужно применить матрицу вращения с несколькими другими битами. Вот пример кода, написанного на AWK, который легко перенести на любой другой язык:

END {
   PI = 3.1415;
   x = 878.0;
   y = 158.0;

   # Translate one origin to the other 
   x1 = x - 128*5;
   # Stretch the height so that it's the same as the width in the isometric
   # This makes the rotation easier
   # Invert the sign because y is upwards in math but downwards in graphics
   y1 = y * -2;

   # Apply a counter-clockwise rotation of 45 degrees
   xr = cos(PI/4)*x1 - sin(PI/4)*y1;
   yr = sin(PI/4)*x1 + cos(PI/4)*y1;

   # The side of each isometric tile (which is now a square after the stretch) 
   diag = 64 * sqrt(2);
   # Calculate which tile the coordinate belongs to
   x2 = int(xr / diag);
   # Don't forget to invert the sign again
   y2 = int(yr * -1 / diag);

   # See the final result
   print x2, y2;
}

Я проверил это с несколькими различными координатами, и результаты кажутся правильными.

Я попробовал решение acfrancis и обнаружил, что функция имеет свои пределы, когда дело доходит до отрицательных показателей. На тот случай, если кто-то еще решит эту проблему: Причина проблемы: отрицательные значения, такие как -0,1.... будут приведены к 0 вместо -1. Это классическая проблема "есть только один ноль" для массивов.

Чтобы решить эту проблему: перед приведением значений x2, y2 к int: проверьте, если xr/diag < 0 и, если true, result = result - 1 (соответственно для y2: yr * -1 / diag < 0, то result = result -1) затем вы приводите значения результата к int, как раньше.

Надеюсь, поможет.

Дополнение: перевод источника на 128*5 кажется специфичным для определенного случая, поэтому я думаю, что это следует удалить, чтобы обобщить функцию.

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