Мы разделим прямоугольник на 4 конечные линии.
Мы можем построить линейное уравнение ax + by + c = 0
, соединяющее точки (x1, y1)
и (x2, y2)
следующим образом:
mx - y + c = 0
, где m = (y2-y1) / (x2-x1)
Наименьшее (перпендикулярное) расстояние от линии ax + by + c = 0
до точки (xc, yc)
определяется выражением:
d = (a*xc + b*yc + c) / sqrt(a*a + b*b)
или d = (m*xc - yc + c) / sqrt(m*m + 1)
в соответствии с приведенным выше уравнением
Для бесконечных линий вы можете проверить, меньше ли 'd' радиуса круга.
Но для конечных линий вам также необходимо убедиться, что точка соприкосновения находится внутри линии.
Теперь m = tan (угол). Вы можете иметь
cos = 1 / sqrt(m*m + 1); sin = m / sqrt(m*m + 1)
Тогда вы можете рассчитать точку контакта как
xp = xc + d*cos; yp = yc + d*sin
А чтобы проверить, лежит ли (xp, yp)
между точками, соединяющими линию, вы можете сделать простую проверку как
if(x1 < xp < x2 && y1 < yp < y2)
return true
в зависимости от того, что больше среди x1 x2 и y1 y2.
Вы можете повторить один и тот же алгоритм для всех четырех линий прямоугольника, передав точки.
Пожалуйста, поправьте меня, если я где-то ошибаюсь.