保持中心与长短轴比不变时,求解两椭圆相切的缩放因子的解析几何方案
我完全懂你的需求——在软件里做这个计算,数值迭代法(比如牛顿法)虽然能用,但解析解不仅更快,还能避开收敛性的坑。咱们一步步把这个问题拆解清楚:
一、先明确问题边界
我们要解决的核心问题:
- 两个椭圆的中心$(h_1,k_1)$和$(h_2,k_2)$固定不动,位置完全不改变
- 各自的长短轴比例$r_1 = a_1/b_1$、$r_2 = a_2/b_2$保持恒定
- 找到缩放因子$s$(假设缩放第一个椭圆,缩放后方程为$\frac{(x-h_1)^2}{(a_1 s)^2} + \frac{(y-k_1)^2}{(b_1 s)^2} = 1$),让两个椭圆恰好相切
二、特殊情况:长短轴比例相同的椭圆
你已经提到这个场景的解法,这里再补充下背后的逻辑:当$r_1=r_2$时,我们可以用仿射变换把两个椭圆都转成圆——仿射变换会保留相切关系、中心相对位置,以及缩放比例。变换后只需要算两圆心的距离,结合圆的半径关系就能直接算出$s$,再逆变换回去就得到椭圆的缩放因子。
对应的椭圆“有效半径”公式你也给出了:
$$\frac{a \cdot b}{\sqrt{a^2 \sin^2 \theta + b^2 \cos^2 \theta}}$$
这里的$\theta$取两中心连线的角度,代入后就能直接得到合适的$s$,这个方法确实能覆盖所有角度的情况。
三、通用情况:长短轴比例不同的椭圆
这才是真正的难点,但你找公共切点的思路完全正确——两个椭圆相切时,会有一个公共点,且在该点的切线完全重合。我们可以通过这个条件推导出解析方程,最终用求根公式直接求解。
推导步骤:
参数化公共切点
假设公共切点为$(x,y)$,它同时在两个椭圆上,因此满足:
$$\frac{(x-h_1)^2}{(a_1 s)^2} + \frac{(y-k_1)^2}{(b_1 s)^2} = 1 \tag{1}$$
$$\frac{(x-h_2)2}{a_22} + \frac{(y-k_2)2}{b_22} = 1 \tag{2}$$切线系数成比例条件
两个椭圆在$(x,y)$处的切线方程分别为:
$$\frac{(x-h_1)(X-h_1)}{(a_1 s)^2} + \frac{(y-k_1)(Y-k_1)}{(b_1 s)^2} = 1$$
$$\frac{(x-h_2)(X-h_2)}{a_2^2} + \frac{(y-k_2)(Y-k_2)}{b_2^2} = 1$$
因为是同一条切线,所以它们的$X$、$Y$系数必须成比例,即:
$$\frac{(x-h_1)/(a_1 s)2}{(x-h_2)/a_22} = \frac{(y-k_1)/(b_1 s)2}{(y-k_2)/b_22} = \lambda \tag{3}$$
($\lambda$是比例常数)消去参数得到关于$s$的方程
从式(3)可以解出$(x-h_1)$和$(y-k_1)$的表达式:
$$x-h_1 = \lambda \cdot \frac{(a_1 s)2}{a_22} \cdot (x-h_2) \tag{4}$$
$$y-k_1 = \lambda \cdot \frac{(b_1 s)2}{b_22} \cdot (y-k_2) \tag{5}$$
注意到$x-h_2 = (x-h_1) + (h_1 - h_2)$,$y-k_2 = (y-k_1) + (k_1 - k_2)$,把式(4)(5)代入这个关系,就能消去$(x-h_2)$和$(y-k_2)$,得到只含$(x-h_1)$、$(y-k_1)$、$\lambda$、$s$的式子。再把这些代入式(1)和(2),最终可以消去$\lambda$和$(x,y)$,得到一个关于$s$的代数方程,这个方程可以用求根公式直接求解。
简化计算的技巧
如果你的软件需要高效计算,可以先做坐标平移:把第一个椭圆的中心移到原点(即令$h_1=0,k_1=0$,$h_2=d_x=h_2-h_1$,$k_2=d_y=k_2-k_1$),这样能减少大量重复计算。
另外,你提到的demo里用$\theta = \tan^{-1} \left( -\frac{b}{a} \cdot m \right)$估算切点的方法是近似的,而上面的解析方法能精确求出$s$,并且全程不需要迭代。
四、总结
- 当两个椭圆长短轴比例相同时,用仿射变换转圆的方法,结合椭圆有效半径公式快速计算$s$
- 当比例不同时,通过公共切点的切线系数成比例条件,推导出关于$s$的解析方程,用求根公式求解即可,完全没有数值迭代的开销
备注:内容来源于stack exchange,提问作者Beygi

