Экранные координаты в изометрические координаты
Я борюсь за преобразование координат мыши / экрана в индекс изометрической плитки. Я пробовал все формулы, которые я мог найти здесь или в Интернете, но ни одна из них, кажется, не работает, или я что-то упускаю. 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 кажется специфичным для определенного случая, поэтому я думаю, что это следует удалить, чтобы обобщить функцию.