我有一些建议。您可以尝试 LibreCAD,它有一个求解两个椭圆的公切线的解算器,但我对 API 一无所知。求解器求解四次方程,如果您天真地尝试找到两个椭圆的公切线,就会得到这个结果。
如果您想自己动手:只需一点理论(“二次曲线范围”),您所要求的就可以通过线性代数(即求 3x3 矩阵的逆)加上求解二次方程和一个三次方程来完成。事情是这样的:
您可以用矩阵方程的形式表达任何二次曲线(例如椭圆)
[m00 m01 m02] [x]
[x,y,z] [m10 m11 m12] [y] = 0
[m20 m21 m22] [z]
其中矩阵M
是对称的并且[x,y,z]
是齐次坐标;想一想z=1
。我们可以将该方程简写为X M X^T = 0
where X^T
是转置X
.
平面上的直线可以写成以下形式lx+my+nz=0
所以有“线坐标”(l,m,n)
.
上述二次曲线的切线组可以用这种表示法非常简单地表达。让A
是矩阵的逆矩阵M
。那么圆锥曲线的切线集是
[a00 a01 a02] (l)
(l,m,n) [a10 a11 a12] (m) = 0
[a20 a21 a22] (n)
现在假设我们有第二个带有矩阵的二次曲线N
, 然后N
有逆的B
。公切线将满足上述方程和方程
[b00 b01 b02] (l)
(l,m,n) [b10 b11 b12] (m) = 0
[b20 b21 b22] (n)
事实上,我们可以将后一个方程中的矩阵标量乘以t
并且它仍然会保持:
[b00 b01 b02] (l)
(l,m,n) t [b10 b11 b12] (m) = 0
[b20 b21 b22] (n)
将第一个二次曲线的切线方程添加到上述第二个二次曲线的方程中,我们得到矩阵方程L (A + tB) L^T = 0
。因此,两个二次曲线的任何公切线都是“范围”中每个二次曲线的公切线A + tB
.
现在,对于大的简化想法:我们可以在该范围内找到一些非常特殊的二次曲线,“退化”二次曲线,它们只是点对。由于公切线必须穿过所有二次曲线,因此它们必须穿过简并二次曲线。但是很容易找到穿过简并二次曲线的线,因为这样的二次曲线只是点对!
通过求解三次方程可以找到简并二次曲线det(A + tB) = 0
where det()
是 3x3 矩阵的行列式。三次方程可以通过卡尔达诺公式或变体以封闭形式求解,或者如果您需要的话,也可以通过数值求解。一旦找到以下值t
这使得退化二次曲线,你可以分解方程L (A + tB) L^T = 0
分解为两个线性因子。每个线性因子xl + ym + zn = 0
定义齐次坐标中的点[x,y,z]
,或在笛卡尔坐标系中(x/z,y/z)
。您应该以这种方式获得三个点对(六个点)。通过某些点对绘制直线将为您提供四条(最多)切线。
这是一个简单的例子(其中两个椭圆的中心都在原点):找到公切线x^2+2y^2=3
and x^2+14y^2=7
。矩阵形式的二次曲线是
[1 0 0] [x] [1 0 0] [x]
[x,y,z] [0 2 0] [y] = 0, [x,y,z] [0 14 0] [y] = 0
[0 0 -3] [z] [0 0 -7] [z]
切线由下式给出
[6 0 0] (l) [14 0 0] (l)
(l,m,n) [0 3 0] (m) = 0, (l,m,n) [ 0 1 0] (m) = 0
[0 0 -2] (n) [ 0 0 -2] (n)
请注意,我将逆矩阵乘以标量只是为了使条目成为整数而不是有理数。您不必这样做,但它使手工计算更容易。将第二个矩阵乘以另一个标量t
gives
[6+14t 0 0 ] (l)
(l,m,n) [0 3+t 0 ] (m) = 0
[0 0 -2-2t] (n)
圆锥曲线是退化的,当(6+14t)(3+t)(-2-2t)=0
,即当t=-3/7, -3, -1
. When t=-3/7
we get
18/7 m^2 - 8/7 n^2 = 2/7 (9 m^2 - 4 n^2) = 2/7 (3m - 2n)(3m + 2n) = 0
这对应于具有齐次坐标的点[x,y,z] = [0,3,-2]
and [0,3,2]
,换句话说就是具有笛卡尔坐标的点(0,-3/2)
and (0,3/2)
.
When t=-3
we get -36l^2 + 4n^2 = (6l+2n)(-6l+2n) = 0
, 点[6,0,2]
and [-6,0,2]
或在笛卡尔坐标系中(3,0)
and (-3,0)
。最后,当t=1
we get -8l^2 + 2m^2 = 2(2l+m)(-2l+m) = 0
对应点[2,1,0]
and [-2,1,0]
它们是无穷远点。
现在避免无穷远点,只是因为它们更难处理,我们通过以下两对点得到四条线:
{(0,-3/2),(-3,0)}, {(0,-3/2),(3,0)}, {(0,3/2),(-3,0)}, {(0,3/2),(3,0)}
这给了我们两个椭圆的四个公切线。
从图中可以看出,公切线也经过无穷远点[2,1,0]
and [-2,1,0]
,即平行线对具有斜率1/2
and -1/2
.
那不是很漂亮吗?