圆的切线

Tangent lines to a circle

如果已知半径为 r 的圆有 B 点切线,圆外有 D 点,如何找到通过 B 和 D 的切线的交点?

如果唯一已知的值是图中所示的蓝色值,我如何找到 E 点? 我想我缺少将类似示例与其他已知值结合起来得出解决方案的数学背景。

我们可以写出两个向量方程:

-向量EB垂直于半径CB,所以点积为零

EB.dot.CB = 0  or
(ex - bx)*(bx - cx) + (ey - by)*(by - cy) = 0   (1)

-从中心 C 到直线 DE 的距离的平方等于半径的平方(使用矢量积)

(DC x ED)^2 / |ED|^2 = R^2
((dx-cx)*(ey-dy)-(dy-cy)*(ex-dx))^2 = R^2 * ((ex-dx)^2+(ey-dy)^2)     (2)

方程 (1)(2) 形成两个未知数 ex, ey 的方程组。解决它,得到0、1或2个解(由于二次方程)

先通过运行一些综合几何,可以用三角形BCD上的余弦定理来表示CD,然后用三角CDF的毕达哥拉斯定理求出DF的长度d。然后,将余弦定律应用于三角形 BDE 以求出 EF 的长度 e,其中 e = DE - d。由于 EB = EF = e,您只需先对向量 AB 进行单位化,然后乘以 e 即可找到向量 BE。之后只需将 B 的坐标添加到 BE.

点 H 是直线 AB 上的另一点,因此直线 DH 是圆的另一切线。

import numpy as np
import math
'''
input A, B, D, r
'''
A = [ 0,-4] 
B = [-1, 1]
D = [ 5, 0]
r = 2


A = [  5.49, -8.12] 
B = [  1.24,  1.82]
D = [ 15.95, -1.12] 
r = 3

A = np.array(A)
B = np.array(B)
D = np.array(D)

AB = B - A
l_AB = math.sqrt(AB[0]**2 + AB[1]**2)
AB = AB / l_AB

BD = D - B
l_BD = math.sqrt(BD[0]**2 + BD[1]**2)

cos_alpha = (-AB[0]*BD[0] - AB[1]*BD[1]) / l_BD
sin_alpha = math.sqrt(1 - cos_alpha**2)

d = math.sqrt( l_BD**2 - 2*r*l_BD*sin_alpha )

e = (l_BD**2 - d**2) / (2*d - 2*l_BD*cos_alpha)
E = B + e*AB

h = (l_BD**2 - d**2) / (2*d + 2*l_BD*cos_alpha)
H = B - h*AB

AB_perp = [AB[1], -AB[0]]
AB_perp = np.array(AB_perp)
C = B + r*AB_perp

CE = E - C
l2_CE = CE[0]**2 + CE[1]**2
G = C + (r**2 / l2_CE)*CE

F = B + 2*(G - B)

print('E =', E)
print('H =', H)
print('C =', C)
print('G =', G)
print('F =', F)