【问题标题】:Distance between ellipse path and point?椭圆路径和点之间的距离?
【发布时间】:2009-10-14 16:08:18
【问题描述】:

所以,我在绘图表面上处理椭圆,我需要知道从椭圆路径(线粗中心很好)到给定点的最短距离。

如果需要的话,我可以用原始数学来做到这一点,因为我知道椭圆的长轴和短轴。据我所知,这将相当复杂。

我想知道我的视图是否可以为我计算这个?

我正在使用 EllipseGeometry 并设置轴。然后将 EllipseGeometry 传递给路径 (Path.Data) 并进行绘制。

有什么想法想知道到路径的最短距离是多少?

【问题讨论】:

标签: silverlight math


【解决方案1】:

只是为了结束这个循环:

我找到了一些 C++ 代码,这些代码用数学来完成,并翻译成 C#。我不知道它是如何工作的,但确实如此。

最终,当鼠标靠近它时,我希望突出显示一个椭圆。我也可以用不同的方法来实现这一点(但仍然使用纯数学方法):

创建第二条路径,其几何形状和平移与我显示的路径相同,但 StrokeThickness 更厚,不透明度为 0.1。在较大的不透明路径上进行一些命中测试。

【讨论】:

  • 你能分享一下解决方案吗?
  • 对不起,那是 9 年前的事了。我什至不记得这次谈话,从那以后我已经换了三次工作;)
  • 感谢回复)9 年过去了,我仍然在努力寻找 Java 或 C# 中的算法)
【解决方案2】:

我阅读了上面提到的文章。我有实现它的数学背景,但没有耐心。如果您要使用牛顿法来近似某个东西,为什么还要费心去做导数、代数等等呢?

这是我的想法:

1) Assume ellipse is (x/a)^2 + (y/b)^2 = 1
   That is, the origin is at zero and the rotation angle is zero. 
(Transform your ellipse and point of interest P1 by rotation and translation if necessary before beginning.)
2) Convert the ellipse into parametric form.
       x = a cos t  
       y = b sin t
3) Divide the parametric range of "t" into N parts, from 0 to 2*PI.
N = 16 seems like a good number (22.5 degrees).
4) Iterate through the N points along the ellipse, stepping t by 2*PI/N each time.
5) Compute the point P2 on the ellipse.
6) Compute the distance from P1 to P2.
7) Keep track of the closest distance dmin found so far, and the value of the parameter as tmin.
8) Start a second loop, but shrink the range for t to being  (tmin - 2*PI/N, tmin + 2*PI/N).
9) Repeat the search, dividing this smaller range by N again.
10) Add new loops as necessary until the distance between successive points is less than the tolerance that matters to you.

将椭圆近似为具有主半径的圆,因为 C = 2*PI*R,当 N = 2*PI*R 时,被测试的连续点将相隔一个像素。

每循环使用 16 步,要比较的点数为 16*log8(PI*R)。

作为进一步的改进,我会将点反映到第一个坐标(正 x 和 y)中。这样可以节省对椭圆 3/4 的计算。

上述算法导致代码更简单:更容易编写和调试。效率是另一回事。对于许多应用程序,它应该足够好。

【讨论】:

    【解决方案3】:

    如果您要做很​​多几何、测量等方面的工作,我强烈推荐Farseer Physics Engine for Silverlight。我在一个益智游戏中使用了它,它在为你管理所有数学方面做得很好。

    我只是在物理模拟器中创建我需要的形状,然后使用它们在物理模拟器中的位置将它们渲染到画布上。

    【讨论】:

      【解决方案4】:

      只是对 Paul Chernoch 方法的快速补充(事后很久,对于那些可能会发生的人)——不要陷入错误的精确感。每次您将一个部分细分为更多子部分时,都会继承“父”部分的错误。换句话说,优化后的结果永远不会比您在该迭代中开始的 tmin 和 tmax 值更准确。

      如果您需要非常准确的结果,请务必在第一个循环中从较大的 N 值开始。

      【讨论】:

        【解决方案5】:

        计算一个外点到一个椭圆在同一平面上的距离是一件很简单的事情。需要最少的代数。没有微积分。 同一平面上两个椭圆之间的最小距离稍微复杂一些,但没有那么难。可以用一个点到一个椭圆的最小距离的简单触发器迭代过程来完成。

        【讨论】:

        • 如果您解释了如何计算距离将会很有帮助。
        猜你喜欢
        • 2018-05-07
        • 1970-01-01
        • 2022-01-06
        • 1970-01-01
        • 2016-07-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多