python代码已知直线方程和圆的圆心,半径,求直线和圆的交点
时间: 2023-11-17 07:08:12 浏览: 91
假设直线方程为 $y = kx + b$,圆心坐标为 $(x_0, y_0)$,半径为 $r$,直线与圆的交点坐标为 $(x, y)$。
我们可以代入直线方程得到:
$$y = kx + b$$
将 $y$ 代入圆的方程,得到:
$$(x-x_0)^2 + (kx+b-y_0)^2 = r^2$$
展开并移项,得到一个二次方程:
$$(1+k^2)x^2 + 2(kb-ky_0-kx_0) x + b^2+y_0^2+x_0^2-2by_0-2bx_0-r^2 = 0$$
解这个二次方程,即可得到交点坐标 $(x, y)$:
$$x = \frac{-(kb-ky_0-kx_0) \pm \sqrt{(kb-ky_0-kx_0)^2 - (1+k^2)(b^2+y_0^2+x_0^2-2by_0-2bx_0-r^2)}}{1+k^2}$$
$$y = kx + b$$
接下来是Python代码实现,其中我定义了一个 `find_intersection` 函数,输入直线方程和圆的信息,返回交点坐标。注意,如果直线与圆没有交点(即判别式为负数),则返回 None。
```python
import math
def find_intersection(k, b, x0, y0, r):
a = 1 + k ** 2
b = 2 * (k * b - k * y0 - x0)
c = b ** 2 + y0 ** 2 + x0 ** 2 - 2 * b * y0 - 2 * x0 * b - r ** 2
delta = b ** 2 - 4 * a * c
if delta < 0:
return None
x1 = (-b + math.sqrt(delta)) / (2 * a)
x2 = (-b - math.sqrt(delta)) / (2 * a)
y1 = k * x1 + b
y2 = k * x2 + b
return (x1, y1), (x2, y2)
```
下面是一个使用示例:
```python
# 直线方程 y = 2x + 1
k = 2
b = 1
# 圆心坐标 (3, 4),半径 2
x0 = 3
y0 = 4
r = 2
result = find_intersection(k, b, x0, y0, r)
if result is None:
print("直线和圆没有交点")
else:
print("交点1:", result[0])
print("交点2:", result[1])
```
输出结果为:
```
交点1: (1.0, 3.0)
交点2: (2.5, 6.0)
```
阅读全文