假设椭圆E处于“标准位置”,中心在原点,轴平行于坐标轴:
(x/a)^2 + (y/b)^2 = 1 where a > b > 0
边界情况a=b 是圆形,其中法线只是通过中心(原点)的线,因此很容易找到。所以我们省略了对这些情况的讨论。
椭圆在任意点(x,y)的切线斜率可以通过隐式微分求得:
dy/dx = -(b^2 x)/(a^2 y)
对于通过(x,y)和椭圆上指定点p = (u,v)的直线不是,当它的斜率为@987654331的负倒数时椭圆E的法线@:
(y-v)/(x-u) * (-b^2 x)/(a^2 y) = -1 (N)
简化为:
(x - (1+g)u) * (y + gv) = -g(1+g)uv where g = b^2/(a^2 - b^2)
在这种形式中,我们认识到它是右矩形双曲线方程。根据椭圆和双曲线 (2,3,4) 之间有多少交点,我们有很多法线到 E 穿过 p。
通过反射对称性,如果假设p 在E 之外,我们可以将p 放在第一象限:
(u/a)^2 + (v/b)^2 > 1 (exterior to E)
u,v > 0 (1'st quadrant)
我们可能有u=0 或v=0 的边界情况,即点p 位于E 的轴上,但这些情况可能会简化为求解二次方,因为两个法线是(重合的)通过该轴的端点的线。我们暂时推迟对这些特殊情况的进一步讨论。
这是一个带有a=u=5,b=v=3 的插图,其中双曲线只有一个分支与E 相交,并且只有两条法线:
如果两个未知数中的两个方程组(x,y) 被简化为一个未知数中的一个方程,最简单的求根方法是a bisection method,但是了解一些关于根/交叉点的可能位置的信息将加快我们的搜索。第一象限的交点是E 到p 的最近点,同样第三象限的交点是E 到p 的最远点。如果点p 离短轴的上端点更近一点,双曲线的分支就会移动到一起,足以在第四象限中再创建两个交点。
一种方法是通过与 x 轴的交点参数化 E。从p 垂直于椭圆的线必须与长轴相交,长轴是有限区间[-a,+a]。我们可以测试通过p=(u,v) 和(z,0) 的直线的交点q=(x,y) 的上下交点,因为z 从-a 扫到+a,寻找椭圆和双曲线相交的地方。
更详细的:
1. Find the upper and lower points `q` of intersection of E with the
line through `p` and `(z,0)` (amounts to solving a quadratic)
3. Check the sign of a^2 y(x-u) - b^2 x(y-v) at `q=(x,y)`, because it
is zero if and only `q` is a point of normal intersection
一旦检测到符号发生变化的子区间(上部或下部),就可以对其进行细化以获得所需的精度。如果只需要适度的精度,则可能不需要使用更快的根查找方法,但即使需要它们,也有一个短的子区间来隔离一个根(或第四象限中的根对)将是有用的。
**更多来比较各种方法的收敛性**