В триангулированной изометрической сетке, какой треугольник является поданной точкой?

У меня есть триангулированная изометрическая сетка, как это: alt text
(источник: mathforum.org)

В моем коде треугольники сгруппированы столбцами.

Поскольку я толплюсь мышь, я хочу вычислить, в каком треугольнике координаты мыши находятся. Существует ли простой алгоритм, чтобы сделать это?

5
задан Glorfindel 16 June 2019 в 04:05
поделиться

2 ответа

Что вы хотите сделать, так это как можно больше превратить это в сетку, потому что с сетками намного проще работать.

Первое, что вы делаете, - это выясняете, в каком столбце он находится. Вы говорите, что сохраняете это, так что это должно быть проще, выполняя простое целочисленное деление по координате x на ширину столбца, смещенную от начала блока. Легкий.

После этого вы хотите решить, в каком треугольнике он находится (очевидно). Как вы частично превращаете это в сетку, вы притворяетесь, что у вас есть стопка прямоугольных треугольников вместо стопки изометрических треугольников.

Треугольники имеют длину вдоль оси y (сторона столбца). Разделите это число пополам и определите, на сколько шагов вы вниз. В зависимости от количества шагов вниз и четности или нечетности столбца вы узнаете, смотрите ли вы на:

+--------+
|-_      |
|  -_    |
|    -_  |
|      -_|
+--------+

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

У вас есть несколько вариантов для этого.

  1. Вы можете использовать что-то вроде линейного алгоритма Брезенхэма для растеризации гипотенузы, и когда вы попадете в столбец, вы будете работать над тем, находитесь ли вы выше или ниже этой линии;
  2. Потому что здесь есть только две возможные сетки (одна будучи противоположным другому, так что на самом деле это только один). Вы можете сохранить массив значений строк, заявив, что для столбца 3 гипотенуза находится со смещением 2, тогда как для 6 - с 4 и так далее.

Вы даже можете использовать (1) для генерации (2) в качестве быстрого поиска.

Единственное, что следует учитывать, это что произойдет, если курсор мыши окажется на краю?

4
ответ дан 14 December 2019 в 08:49
поделиться

Это похоже на то, что сказал Клет, но я полагаю, что это другой взгляд на это.

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

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

3
ответ дан 14 December 2019 в 08:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: