Идея состоит в том, чтобы найти пересечение траектории центра объекта и линии, перемещенной по радиусу круга, см. Эту картинку.
Вво-первых, вам нужно найти normal в строке.Как это сделать, зависит от того, как определена линия, если она определена двумя точками, формула будет
nx = ay - by
ny = bx - ax
Если линия определена каноническим уравнением, то коэффициенты на x и y определяют нормаль, если я правильно запомнил.
Когда нормаль найдена, нам нужно ее нормализовать - установите длину в 1, разделив координаты на длину вектора.Пусть это будет n .
Затем мы спроецируем начальную точку, желаемую точку и случайно выбранную точку на линии на n , рассматривая их как радиус-векторов.
Проекция вектора a на вектор b равна
project (a, b) = scalar_product (a, b) / length (b)**2 * b
, но поскольку b равна n , длина которого равна 1, мы не будем применять деление, а также мы хотим только найти длину результата, мы не умножаем на b .Таким образом, мы вычисляем только скалярное произведение с n для каждой из трех вышеупомянутых точек, получая три числа, пусть s будет результатом для начальной точки, d для нужной точки, l для выбранной точки на линии.
Тогда мы должны изменить l на радиус окружности:
if (s < d) l -= r;
else if (s > d) l += r;
Если s = d , ваш объект движется параллельно вдоль линии, поэтому линия не может препятствовать его движению.Это очень маловероятный случай, но с ним нужно разобраться.
Кроме того, важно, если l изначально был между s и d , но после изменениямежду ними больше нет, это особый случай, который вы можете обработать (например, ограничить движение объекта)
А затем, вы должны вычислить (d - s) / (l - s) .
Если результат больше или равен 1, объект не достигнет линии.
Если результат находится между 0 и1, линия препятствует движению, и результат указывает на часть пути, по которому будет проходить объект.0.5 означает, что объект остановится на полпути.
Если результат отрицательный, это означает, что линия находится за объектом и не будет препятствовать движению.
Обратите внимание, что при использовании чисел с плавающей точкой результат не будет идеальноточный, поэтому мы рассматриваем этот особый случай.Если вы хотите, чтобы это вообще не происходило, организуйте цикл и пробуйте аппроксимации, пока не будет достигнута необходимая точность.