问题如下: 我的折线通常包含1000-10000个点。我需要使用最多5个中间点来计算沿折线的最大距离。 形式上:我正在寻找A,B,C,D,E点,其中FirstPointOfThePolyline-A-B-C-D-E-LastPointOfThePolyline距离最大。
结果必须准确,假设不起作用。
我已经找到了一种能保证给出最佳效果的算法,但是当它搜索每个点时它很慢:
(仅显示3分)
Array of points - P
Start point - P[0]
Finish point P[max]
1) create an array D0, where D0[x] = distance(P[x], P[0])
2) create an array D1, where D1[x] = max(D0[a] + distance(P[x], P[a])) over a in 0..x
- Array D1 now contains for every point 'x' maximum distance over 1 turnpoint to the point 'x'
3) create an array D2, where D2[x] = max(D1[a] + distance(P[x], P[a])) over a in 0..x
- Array D2 now contains for every point 'x' maximum distance over 2 turnpoints
4) Compute BestDistance = max(D2[a] + distance(P[max], P[a])) over a in 0..max
我想让它变得更快的想法是让折线更简单,例如只保持每10个点,快速找到这个“消除列表”中算法的AE点,然后在第二轮中获取这些AE点的给定半径内的所有点,并仅使用这些圈子中的点再次运行算法。 这种方法更快,但它假设真正的A-E点将位于第一轮中找到的5个点附近的某个位置,这有时被证明是错误的陈述。
我搜索了几个可能有帮助的折线简化算法,但我不能100%确定这是否能解决我的问题。
所以真正的问题是:
我要么需要
1。)折线简化算法,使上述算法运行得更快,但仍然保证找到最佳解决方案
OR
2。)如果你们中的一些人知道一种完全不同的算法,可以准确,快速地解决问题,我也会接受它:)
我知道这个问题可以解决,因为我已经看到一台软件在我的电脑上做了不到1秒钟(这是一台普通的电脑)我只是不知道它是如何完成工作的:)
我需要在C#中执行此操作,但当然欢迎任何伪代码:)
提前致谢。
干杯, 拉斯洛