Поскольку на этот вопрос пока нет ответа, и это один из лучших результатов для "изометрического экрана", я решил ответить на это (не говоря уже о том, что я только что закончил).
Поскольку у вас есть функция, которая отображает изо-сетку на экранные координаты, и это линейное преобразование с обратным, мы можем просто вернуться назад, чтобы получить другую функцию. Итак, давайте сделаем это.
Мы хотим перейти от:
rx = (x - y) * (surface.Width) / 2 - globX
ry = (x + y) * (surface.Height) / 2 - globY
до:
x = <something>
y = <something>
Проще всего решить их одновременно. Добавьте глобалы к обеим сторонам:
rx + globX = (x - y) * (surface.Width) / 2
ry + globY = (x + y) * (surface.Height) / 2
Разделите на (surface.Width) / 2
и (surface.Height) / 2
:
(rx + globX) / (surface.Width / 2) = x - y
(ry + globY) / (surface.Height / 2) = x + y
Почти готово, давайте сложим оба уравнения вместе, чтобы избавиться от y
:
(rx + globX) / (surface.Width / 2) + (ry + globY) / (surface.Height / 2) = 2 * x
Теперь, чтобы избавиться от x, вычтите первое уравнение из второго:
(ry + globY) / (surface.Height / 2) - (rx + globX) / (surface.Width / 2) = 2 * y
Разделите оба уравнения на 2, и мы предварительно сделали:
x = ((rx + globX) / (surface.Width / 2) + (ry + globY) / (surface.Height / 2)) / 2
y = ((ry + globY) / (surface.Height / 2) - (rx + globX) / (surface.Width / 2)) / 2
Круто, теперь у вас есть координаты сетки в терминах экрана. Давайте разберемся с этим, поскольку у нас в основном (a / (b / c)) / c
, что совпадает с a / b
, мы можем избавиться от c
, в данном случае 2
:
x = (rx + globX) / surface.Width + (ry + globY) / surface.Height
y = (ry + globY) / surface.Height - (rx + globX) / surface.Width
Таким образом, вы должны иметь возможность написать функцию, которая занимает на экране позиции x и y и возвращает позиции сетки x и y. Я не очень хорошо знаком с c #, поэтому я не знаю, как он обрабатывает значения с плавающей точкой, которые должны быть целыми числами, но, поскольку вы работаете с этим на Android, я полагаю, это не имеет большого значения.