У меня есть триангулированная изометрическая сетка, как это:
(источник: mathforum.org)
В моем коде треугольники сгруппированы столбцами.
Поскольку я толплюсь мышь, я хочу вычислить, в каком треугольнике координаты мыши находятся. Существует ли простой алгоритм, чтобы сделать это?
Что вы хотите сделать, так это как можно больше превратить это в сетку, потому что с сетками намного проще работать.
Первое, что вы делаете, - это выясняете, в каком столбце он находится. Вы говорите, что сохраняете это, так что это должно быть проще, выполняя простое целочисленное деление по координате x на ширину столбца, смещенную от начала блока. Легкий.
После этого вы хотите решить, в каком треугольнике он находится (очевидно). Как вы частично превращаете это в сетку, вы притворяетесь, что у вас есть стопка прямоугольных треугольников вместо стопки изометрических треугольников.
Треугольники имеют длину вдоль оси y (сторона столбца). Разделите это число пополам и определите, на сколько шагов вы вниз. В зависимости от количества шагов вниз и четности или нечетности столбца вы узнаете, смотрите ли вы на:
+--------+
|-_ |
| -_ |
| -_ |
| -_|
+--------+
или наоборот. На этом этапе вам нужно только определить, на какой стороне линии он находится, чтобы определить, в каком прямоугольном треугольнике он находится, что также говорит вам, в каком изометрическом треугольнике он находится.
У вас есть несколько вариантов для этого.
Вы даже можете использовать (1) для генерации (2) в качестве быстрого поиска.
Единственное, что следует учитывать, это что произойдет, если курсор мыши окажется на краю?
Это похоже на то, что сказал Клет, но я полагаю, что это другой взгляд на это.
Я предполагаю, что сторона треугольника равна 1.
Предположим, у вас есть сетка, как показано ниже:
y'
/
/__/__/__/__/__/__/
/__/__/__/__/__/__/
/__/__/__/__/__/__/____ x'
(0,0)
Если вы рассматриваете сетку в системе координат, в которой оси x и y расположены под углом 60 градусов, точка, координата которой в угловой системе (x ', y') будет соответствовать координате в ортогональной системе (с тем же началом и общим направлением осей) на (x, y).
В вашей задаче вам даны (x, y), нам нужно найти (x ', y'), а затем вычислить треугольник.
Если i - единичный вектор вдоль x, а j - ортогональный вдоль y, то мы имеем, что
x'* i + y'( i/2 + sqrt(3) * j /2) = xi + yj.
(В основном единичный вектор вдоль «наклонной» оси y равен i / 2 + sqrt (3) / 2 * j Единичный вектор вдоль оси x такой же, как и нормальная ось x, т. Е. I).
Таким образом
x' + y'/2 = x
y' * sqrt(3)/2 = y
Решение дает:
y' = 2*y/sqrt(3)
x' = x - y/sqrt(3)
Предположим, что x 'и y' положительны.
Теперь, если c = [x '], целая часть x'
и r = [y '], целая часть y'
, то в (угловой) сетке точка лежит в c-й столбец и r-я строка. (Считаем вправо и вверх и начинаем отсчет с 0).
Таким образом, мы сузили вашу точку до параллелограмма.
____
/\ * /
/___\/
(c,r)
Теперь, чтобы выяснить, в каком треугольнике она находится, вы можете рассмотреть дробные части x 'и y'.
{x} = x' - [x'] = x' - c.
{y} = y' - [y'] = y' - r.
Теперь
, если {x} + {y}> 1
, то точка лежит в треугольнике, отмеченном *.
если {x} + {y} <1
, то точка лежит в другом треугольнике.
if {x} + {y} = 1
, то точка лежит на прямой, общей для двух треугольников.
Надеюсь, это тоже поможет.