给定在轴向对齐的,以原点为中心的椭圆E外部的点p,找到通过p的E的(最多)四个唯一法线。
这不是Mathematica问题。直接计算太慢;我愿意为速度而牺牲精度和准确性。
我已经在网上搜索过,但是发现的所有内容都涉及过于复杂的计算,如果直接实现这些计算似乎会缺乏我所需的性能。有没有更“程序化”的方式来做到这一点,例如使用矩阵或将椭圆缩放成一个圆形?
最佳答案
假设椭圆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)
,当其斜率是E
的负倒数时,这对于椭圆dy/dx
是正常的: (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
的法线。通过反射(reflect)对称性,如果假设
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]
。我们可以测试通过q=(x,y)
和p=(u,v)
的直线的交点(z,0)
的上下两端,因为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
一旦检测到符号变化的子间隔(上部或下部),就可以对其进行优化以获得所需的精度。如果仅需要适度的精度,则可能无需使用更快的寻根方法,但是即使需要这些方法,将子根(或第四象限中的根对)隔离开的较短子间隔也将很有用。
**比较各种方法的收敛性**
关于math - 找出椭圆的所有4个法线,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20360355/