【问题标题】:Distance between segment and ellipse线段与椭圆之间的距离
【发布时间】:2020-05-31 12:01:25
【问题描述】:

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

研究了一下,我在Youtube 上找到了该链接,并尝试使用熟悉的 C# 函数复制该方法。 我必须为某些计算添加一些扩展,比如找到椭圆和线段/线(带旋转的椭圆)之间的交点。 几个小时后,我设法复制了该方法,但显然它似乎不太有效。或许是的,我不知道。

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

垂直于初始线段的洋红色线段是使用辅助线段(蓝色)和圆形(红色)之间第一个交点的距离计算得出的

【问题讨论】:

  • 我认为最简单的方法是计算直线和连接椭圆中心的直线的距离(参见:en.wikipedia.org/wiki/Distance_between_two_straight_lines)。然后减去椭圆的公式。
  • 求包含线段 s 的直线 L 与椭圆之间的距离。这是微积分。如果在 s 上实现了最小距离,那么你就完成了。如果最小距离是在 s 上实现的,那么 min 是 s 的一个端点或另一个端点。
  • “显然效率不高”:什么意思?
  • @YvesDaoust,我的意思是该方法源自上面YouTube链接中的图形方法,虽然它不是图形方法,因为我使用了双精度计算,它们并没有太多的计算,是一种间接的方法,找交点找切线。有时切线并没有真正接触到椭圆,我有大概的距离,但我认为用这种方法我将无法找到切线和椭圆之间的交点。
  • @Cheva:那么,有两个问题:他们的方法在数值上准确吗?他们的方法快吗?

标签: c# optimization graph-algorithm computational-geometry


【解决方案1】:

通过相似变换(将中心平移到原点并将特征向量旋转到坐标轴),您可以将椭圆变为其规范形式

x²/a² + y²/b² = 1.

同时,线段的支撑线变成方程

px + qy + r = 0.

现在,通过使用椭圆的参数方程,我们最小化

(p a cosΘ + q b sinΘ + r)²

并通过取消导数,

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

tanΘ = q b / p a.

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

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

通过

-a sinΘ (a cosΘ - x) + b cosΘ (b sinΘ - y) = 0.

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-17
    • 2019-06-26
    • 2016-07-21
    相关资源
    最近更新 更多