Для формулы и кода, который проверяет пересечение отрезка и окружности, взгляните на этот SO ответ .
Остальная часть кода должна быть достаточно ясной, прежде чем сделать ход, проверьте, не произошло ли столкновение, если это произойдет.
В зависимости от предпочитаемого вами поведения, вы также можете подойти как можно ближе к стене, а затем двигаться параллельно ей, чтобы круг «скользил» вдоль стены. Это можно сделать, спроецировав вектор движения на линию в том же направлении, что и стена.
РЕДАКТИРОВАТЬ: Некоторые комментарии о том, как использовать код из ответа для проверки на столкновения:
В коде используется функция Dot
, которая вычисляет точечное произведение из двух векторов. Вы можете создать класс Vector (хорошее упражнение, которое полезно для таких проектов) или вычислить только точечный продукт, используя формулы здесь .
Векторный класс облегчит чтение некоторого кода, но вы также можете напрямую работать с плавающей точкой. Например, давайте посмотрим на вычисление d
(Вектор направления луча) и f
(Вектор от центральной сферы к началу луча), как описано в начале ответа. С векторным классом это будет так же просто, как и используемыми здесь формулами:
// L, E, C, d and f are of some vector type
d = L - E;
f = E - C;
Без векторного класса вы будете иметь отдельные координаты x / y для всех переменных, немного раздувая код, но делая то же самое:
// Twice as much variables, but all of them are usual floats.
dx = Lx - Ex;
dy = Ly - Ey;
fx = Ex - Cx;
fy = Ey - Cy;