计算直线与圆的交点,不用第三方库,方便迁移其他语言
主要应用:图像及几何计算应用
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:
k = (y1 - y2) / (x1 - x2)
b0 = y1 - k * x1
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)))