2013-07-08 141 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