Доброго времени суток, читатели, зрители моего канала programmer's notes. Не забывайте подписываться и писать свои комментарии к моим статьям и видео.
Алгоритм поиска пересечения прямой и окружности
Продолжим наши алгоритмы по геометрии на плоскости. Напомню вот эту статью, где говорится об уравнении прямой по двум известным точкам, в том числе и варианты когда прямая параллельна одно из осей координат. Окружность же будет задаваться координатами центра и значением радиуса. При этом если тройка чисел есть a, b, r, то уравнение окружности будет
(x-a)**2 + (y-b)**2 == r*r
Уравнение прямой имеет вид
A*x + B*y + C = 0
Если даны две точки для определения прямой: (x1, y1), (x2, y2), то
A = (y1-y2)
B = (x2-x1)
C = (x2-x1), x2*y1-x1*y2
См. указанную ранее статью.
Выражаем x из уравнения, подставляем в уравнение окружности и решаем квадратное уравнение. Если есть два корня, то прямая пересекает окружность, если один, то прямая касается окружности, если корней нет, то прямая с окружностью никак не пересекается. Значения x получим из линейного уравнения.
В случае если прямая параллельна оси y, то уравнение будет просто
x = x1
если прямая параллельна оси x, то
y = y1
Мы подставляем значения в уравнение окружности и решаем опять же квадратное уравнение, которое опять может дать пересечение, касание и прямая не пересекает окружность.
Все варианты отражены в программе на рисунок 1
Например на входе
0 0 1 0.5
1 0 1
На выходе
Пересечение
1.6 0.8
0.0 0.0
Пояснение к программе
Функция res() решает квадратное уравнение и возвращает список, который может содержать или два корня. В случае, если список пуст, это значит корней нет.
Пока всё!
Пишите свои предложения и замечания, и занимайтесь программированием, а также проектированием баз данных, хотя бы для поддержания уровня интеллекта.