python计算直线与圆的交点,不用第三方库,方便迁移其他语言

计算直线与圆的交点,不用第三方库,方便迁移其他语言

主要应用:图像及几何计算应用

# 计算圆 与 线段相交的点
def line_intersect_circle(circle_center,r,point1,point2):
    '''
    计算圆心与线段的交点
    :param circle_center: 圆心 (x0,y0)
    :param r: 半径
    :param point1: 线段起始点(x1,y1)
    :param point2: 线段终点(x2,y2)
    :return: 线段与圆的交点
    '''
    x0, y0=circle_center
    x1, y1=point1
    x2, y2=point2
    if r == 0:
        return [[x1, y1]]
    #斜率不存在的情况
    if x1 == x2:
        inp = []
        if abs(r) >= abs(x1 - x0):
            #下方这个点
            p1 = x1, round(y0 - (r ** 2 - (x1 - x0) ** 2)**(0.5), 5)
            #上方这个点
            p2 = x1, round(y0 +(r ** 2 - (x1 - x0) ** 2)**(0.5), 5)
            if max(y1,y2)>=p2[1]:
                inp.append(p2)
            if min(y1,y2)<=p1[1]:
                inp.append(p1)
    else:
        #求直线y=kx+b的斜率及b
        k = (y1 - y2) / (x1 - x2)
        b0 = y1 - k * x1
        #直线与圆的方程化简为一元二次方程ax**2+bx+c=0
        a = k ** 2 + 1
        b = 2 * k * (b0 - y0) - 2 * x0
        c = (b0 - y0) ** 2 + x0 ** 2 - r ** 2
        #判别式判断解,初中知识
        delta = b ** 2 - 4 * a * c
        if delta >= 0:
            p1x = round((-b - delta**(0.5)) / (2 * a), 5)
            p2x = round((-b + delta**(0.5)) / (2 * a), 5)
            p1y = round(k * p1x + b0, 5)
            p2y = round(k * p2x + b0, 5)
            inp = [[p1x, p1y], [p2x, p2y]]
            inp = [p for p in inp if p[0] >= min(x1, x2) and p[0] <= max(x1, x2)]
        else:
            inp = []
    return inp if inp != [] else [[x1, y1]]


print(line_intersect_circle((0, 0),2, (-2,-2), (2,2)))
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
假设直线方程为 $ax+by+c=0$,的方程为 $(x-x_0)^2+(y-y_0)^2=r^2$,其中 $(x_0, y_0)$ 为心坐标,$r$ 为半径。 求解直线交点,即要求解方程组: $$\begin{cases}ax+by+c=0\\(x-x_0)^2+(y-y_0)^2=r^2\end{cases}$$ 将第一个方程代入第二个方程,得到: $$(x-x_0)^2+(y-y_0)^2=r^2\Rightarrow (x-x_0)^2+[\frac{-a}{b}(x-x_0)-\frac{c}{b}-y_0]^2=r^2$$ 将上式展开并化简,得到: $$(1+\frac{a^2}{b^2})(x-x_0)^2 + 2\frac{ac}{b^2}(x-x_0)+(\frac{c^2}{b^2}+y_0^2-r^2)=0$$ 这是一个二次方程,可以使用根公式求解。如果判别式 $b^2-4ac<0$,则说明直线没有交点;如果 $b^2-4ac=0$,则说明直线相切,有一个交点;如果 $b^2-4ac>0$,则说明直线相交,有两个交点。 下面是 Python 代码实现: ```python import math def line_circle_intersection(a, b, c, x0, y0, r): # 计算二次方程的系数 A = 1 + a**2 / b**2 B = 2 * a * c / b**2 - 2 * x0 C = x0**2 + (c/b - y0)**2 - r**2 # 计算判别式 delta = B**2 - 4*A*C if delta < 0: # 直线没有交点 return [] elif delta == 0: # 直线相切,有一个交点 x = -B / (2*A) y = -a/b * x - c/b return [(x, y)] else: # 直线相交,有两个交点 x1 = (-B + math.sqrt(delta)) / (2*A) y1 = -a/b * x1 - c/b x2 = (-B - math.sqrt(delta)) / (2*A) y2 = -a/b * x2 - c/b return [(x1, y1), (x2, y2)] ``` 其中,`a, b, c` 分别为直线方程的系数,`x0, y0, r` 分别为的参数。函数返回一个列表,包含所有交点的坐标。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阳光下的沃土

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值