C# 线段与椭圆之间的距离

C# 线段与椭圆之间的距离,c#,optimization,graph-algorithm,computational-geometry,C#,Optimization,Graph Algorithm,Computational Geometry,我试图找到一种有效的方法来计算给定线段和椭圆之间的距离: 通过研究,我找到了这个链接,并尝试使用熟悉的C#函数复制这个方法。 我必须为某些计算添加一些扩展,比如找到椭圆和线段/直线(带旋转的椭圆)之间的交点。 几个小时后,我成功地复制了这个方法,但显然它似乎效率不高。也许是的,我不知道 我将用颜色来说明它,而不是使用传统的命名法,因为我没有时间把字母放在图表上 通过相似变换(将中心平移到原点,并将特征向量旋转到坐标轴),使用辅助段(蓝色)和圆(红色)之间第一个交点的距离计算垂直于初始段的品红段

我试图找到一种有效的方法来计算给定线段和椭圆之间的距离:

通过研究,我找到了这个链接,并尝试使用熟悉的C#函数复制这个方法。 我必须为某些计算添加一些扩展,比如找到椭圆和线段/直线(带旋转的椭圆)之间的交点。
几个小时后,我成功地复制了这个方法,但显然它似乎效率不高。也许是的,我不知道

我将用颜色来说明它,而不是使用传统的命名法,因为我没有时间把字母放在图表上


通过相似变换(将中心平移到原点,并将特征向量旋转到坐标轴),使用辅助段(蓝色)和圆(红色)之间第一个交点的距离计算垂直于初始段的品红段,你可以把椭圆变成它的标准形式

x²/a² + y²/b² = 1.
同时,管段的支承线变为方程

px + qy + r = 0.
现在,通过使用椭圆的参数方程,我们最小化

(p a cosΘ + q b sinΘ + r)²
(a cosΘ - x)² + (b sinΘ - y)²,
通过取消导数

-p a sinΘ + q b cosΘ = 0

Θ
的值中,您可以在椭圆上获得一个点,并检查它是否投影到线段上。如果不是,则最短距离是到其中一个管段端点的距离。我们最小化

(p a cosΘ + q b sinΘ + r)²
(a cosΘ - x)² + (b sinΘ - y)²,

在这里,通过Weierstrass替换使表达式合理化是有利的,我们得到

- a 2t/(1+t²) (a (1-t²)/(1+t²) - x) + b (1-t²)/(1+t²) (b 2t/(1+t²) - y) = 0


这是一个无法逃避的四次多项式,因为有多达四个解(其中保持最短距离)。

我认为最简单的方法是计算直线和连接椭圆中心的直线之间的距离(参见:)。然后减去椭圆的公式,求出包含线段s的线L和椭圆之间的距离。这是微积分。如果在s上实现最小距离,则完成。如果min distance是在s上实现的,那么min就是s的一个或另一个端点。“显然它似乎不太有效”:你是什么意思?@YvesDaoust,我的意思是该方法源自上面YouTube链接中的图形方法,尽管它不是图形方法,因为我使用了双精度计算,而且他们没有太多的计算,这是一个间接的方法,找到一个交点,找到一个切线。有时切线并不真正接触椭圆,我有近似的距离,但我认为用这种方法我无法找到切线和椭圆之间的交点。@Cheva:那么,有两个问题:他们的方法在数值上准确吗?他们的方法快吗?
- a 2t (a (1-t²) - x (1+t²)) + b (1-t²) (b 2t - y (1+t²)) = 0.