Я смотрю на эту проблему уже несколько дней. Я установил этот график, чтобы помочь мне визуализировать проблему: (из графика мы знаем, что линия пересекает [1, 1], [1, 2], [2, 2], [2, 3], заканчиваясь на [ 3,3])
Я хочу пройти по линии к каждому пространству сетки и проверить, является ли материал пространства сетки твердым. Я чувствую, что уже знаю, как работает математика, но я пока не смог ее связать. Я использую это для проверки прямой видимости и устранения узлов после того, как путь найден с помощью моих алгоритмов поиска пути - мои агенты не могут видеть сквозь сплошной блок, поэтому они не могут перемещаться через один, поэтому узел не исключается из пути, потому что он требуется для навигации по углу.
Итак, мне нужен алгоритм, который будет двигаться вдоль линии к каждому пространству сетки, которое он пересекает. Любые идеи?
Я рассмотрел множество распространенных алгоритмов, таких как алгоритм Брезенхэма, и алгоритм, который шагает с заранее заданными интервалами вдоль линии (к сожалению, этот метод пропускает плитки, если они пересекаются с меньшим клином, чем размер шага).
Сейчас я заполняю свою доску массой функций floor () и ceil (), но она становится слишком сложной, и я боюсь, что это может вызвать замедление.
источник
Ответы:
Если вы знаете начальный блок (вы знаете точку X и вы не включили блок [0,1] в список блоков, поэтому, я полагаю, вы знаете также начальный блок), я думаю, что вы обязательно должны использовать алгоритм Брезенхэма. Вы написали, вы смотрели на это.
Это подходящий алгоритм для этой проблемы. Он также может быть записан таким образом, что он вычисляется только с целыми числами. Вы можете найти множество реализаций в сети.
РЕДАКТИРОВАТЬ:
Извините, я не понял, что Брезенхем не найдет все блоки. Поэтому я нашел лучшее решение . Есть также код, написанный на C ++, но я думаю, что это не должно быть трудно понять :)
источник
Код в примере, на который ссылается принятый ответ, нуждается в некоторой настройке для идеально диагональных линий. Вот полное демонстрационное приложение, написанное на Qt (C ++ и QML).
Соответствующий код C ++:
источник