2013-07-08 111 views
2

我有一个很多点的曲线,导致在GUI级别减慢。我想申请一个算法,删除相邻点过于接近彼此(在价值观,所以可以认为是无用的)算法来平滑曲线

是否有任何着名的算法来做到这一点?我使用C#和ZedGraph

+0

为什么不计算可以说5个点的平均值,而只绘制平均值? – Jan

+0

@Jan:因为如果我在两个相邻点之间有很大的差距,我不想只画一个点到平均值。在这种情况下,我想画两点。 – Guillaume07

+0

这不是一个真正的编程问题。尝试在Math Exchange上查找适当的算法。 –

回答

1

您可以使用Douglas-Peucker算法来减少点的数量和保存的曲线形状。可以找到C#实现here

+0

它似乎是exaclty我正在寻找 – Guillaume07

+0

我写了一个道格拉斯 - 皮克算法的动画的答案,如果你有兴趣... http://stackoverflow.com/a/36937976/2836621 –

0

我不是一个专业人士,但我认为你可以做到这一点,没有任何着名的算法。 以下是我认为(只是一个原则,我不知道在哪个类,你保存你做点):

 Collection<float> ListOfValues = new Collection<float>(); 
     float minimalValueDistance = 0.5f; 
     var listWithoutAdjacentPoints = ListOfValues.Where(x => 
      { 
       int indexOfValue = ListOfValues.IndexOf(x); 
       // only considering the distance from the left 
       if (indexOfValue > 0 && Math.Abs(x - ListOfValues[indexOfValue - 1]) > minimalValueDistance) 
        return true; 
       else 
        return false; 

      }); 
+0

以及行为曲线中的每个点如何相互分离,其值 Guillaume07

+0

我认为你想删除这些点?!?或者我不明白你的问题?你说过,你想“去除相邻点过于紧密(根据数值[...])”。由于“太接近”非常不明确,我为此实施了一个变量。所以你可以将它设置为一个常量值,或者计算代码中的值。例如 –

+0

采取minimalValueDistance = 1,你可以有这样一条曲线:1,5,9,10,11,13,19,20 =>至极会变成1,5,9,10,13,19,但是发生了什么如果你有1,2,3,4,5,6? – Guillaume07