2009-10-14 95 views
1

所以,我在绘图表面上使用了一个椭圆,并且我需要知道从椭圆路径(线厚度的中心很细)到给定点的最短距离。椭圆路径和点之间的距离?

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

我想知道我的观点是否可以为我计算这个?

我正在使用EllipseGeometry并设置坐标轴。然后将EllipseGeometry交给路径(Path.Data)并绘制。

想知道到路径的最短距离是什么?

+0

你是指从一个点到路径的最短距离? – 2009-10-14 16:37:44

+1

下面是一个“原始数学”解决方案:http://mathforum.org/library/drmath/view/52082.html – Jacob 2009-10-14 16:54:53

+0

是的,最短将是很大的... – 2009-10-14 18:20:10

回答

1

刚刚结束对这个循环:

我发现用数学这样做了一些C++代码,并转换到C#。我不知道它是如何工作的,但它确实如此。

最终,当鼠标靠近它时,我正在寻找突出显示的椭圆。我可以用不同的方法完成这个工作(但保留纯数学方法):

创建第二条路径,它与我所显示的路径具有相同的几何和平移,但是使用更厚的StrokeThickness和0.1的不透明度。做一些更大,不透明的路径上的测试。

0

如果你要做很多东西与几何,测量等,我会强烈推荐Farseer Physics Engine for Silverlight。我在一个益智游戏中使用它,它为你管理所有的数学做得很好。

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

1

我读过上面提到的文章。我有数学背景来实现它,但不是耐心。如果你打算用牛顿的方法来近似某些东西,为什么还要去做衍生物,代数等等的麻烦?

这是我的主意:

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的椭圆计算量。

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

0

只是对Paul Chernoch的做法(事后很长时间,对于那些可能发生的事情)的快速谴责 - 不要被误解为错误的精确感。每次将部分切分为更多小节时,您都会继承“父”部分的错误。换句话说,精化结果永远不会比你在迭代中开始的tmin和tmax值更准确。

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

-1

在同一平面上计算一个外部点和一个椭圆之间的距离是非常简单的。需要最少的代数。没有微积分。 同一平面上的两个椭圆之间的最小距离稍微复杂一些,但没有那么难。它可以通过一个简单的触发器迭代程序实现,即一点和一个椭圆之间的最小距离。

+2

如果你解释如何计算距离将是有益的。 – 2011-12-08 22:24:25