📜  两个不相交圆的直接公切线长度(1)

📅  最后修改于: 2023-12-03 15:06:14.050000             🧑  作者: Mango

两个不相交圆的直接公切线长度

如果给定两个不相交的圆,如何求它们的直接公切线长度呢?这是一个计算几何中的经典问题,本文将介绍两种常见的解法。

解法一:求圆心距离

图中,有两个不相交的圆,圆心分别为 $O_1$ 和 $O_2$,半径分别为 $r_1$ 和 $r_2$。可以将这两个圆沿着它们的圆心连线移动,直到它们相切,此时两圆心的距离为 $d$。

两个圆心距离的情况

记两圆心间距为 $d$,则两圆的直接公切线长度 $L$ 满足:

$$L = \sqrt{d^2 - (r_1 - r_2)^2} - \sqrt{d^2 - (r_1 + r_2)^2}$$

此时的时间复杂度为 $O(1)$。

解法二:枚举切点

如果一定要求出两圆的所有公切线长度,那么可以枚举两个圆的所有切点(可能有两个或零个),并算出每一条切线的长度。这样可以枚举出所有的情况,但时间复杂度为 $O(r_1r_2)$,在圆半径较大时并不可行。

枚举切点的情况

圆 $O_1$ 和圆 $O_2$ 的切点有两个,分别为 $P_1$ 和 $P_2$。记 $P_1P_2$ 与两圆心连线的夹角分别为 $\theta_1$ 和 $\theta_2$,半径分别为 $l_1$ 和 $l_2$。则 $\sin(\theta_1 + \theta_2) = \frac{r_2}{l_1}$,$\sin(\theta_1 - \theta_2) = \frac{r_1}{l_2}$。

由正弦定理可得:

$$L = 2\sqrt{l_1^2 - r_2^2} \cdot \sin(\frac{\theta_1 + \theta_2}{2}) = 2\sqrt{l_2^2 - r_1^2} \cdot \sin(\frac{\theta_1 - \theta_2}{2})$$

时间复杂度为 $O(n^2)$,其中 $n = \max(r_1, r_2)$。

总结

如果只需要求两圆的直接公切线长度,使用解法一即可。如果需要求所有的公切线长度,使用解法二。但需要注意,解法二的时间复杂度较高,在圆半径较大时并不可行。