2012-11-16 71 views
0

我想將用戶在android屏幕上手繪的「sample」線條變成一個數組。 x座標是等距的,很可能是1D數組的索引。爲了舉例說明我的意思,如果用戶繪製近似正弦波,我想創建一個數組,可以將近似正弦波轉換爲另一個圖形,或者用於音頻合成。將繪製線條抽樣成陣列

我有一個基本的想法,做法,開始使用數組:

float samples[] = new float[100] // or some other arbitrary number 

然後,一個ontouch方法:

@Override 
    public boolean onTouch(View v, MotionEvent event) { 
     float x = event.getX(); 
     float y = event.getY(); 
     if(event.getAction() == MotionEvent.ACTION_DOWN || event.getAction() == MotionEvent.ACTION_MOVE){ 
      // assume we translate x into relative index from 0-99 at this point 
      if(!xHasPoint(x, samples)){ 
       drawNewPoint(); 
       samples[x] = y; 
      } 
      invalidate(); 
      return true; 
     } 
     else{ 
      invalidate(); 
      return false; 
     } 
    } 

private static boolean xHasPoint(float x, float[] a){ 
    if(a[x] == !null){ 
     return true; 
    } 
    else{ 
     return false; 
    } 
} 

所以我的問題是,你能不能提出一個更好的方法這個問題?我預見不得不外推大量數據......在最後循環遍歷數組,並從最接近的非空值中分配空索引平均值,這種事情。

另一方面,如果這看起來沒有錯,我是否缺少重要的重要考慮因素?

回答

1

唯一的問題是,一旦你的數組已滿,你不能繼續添加更多的點。我建議,你可以使用可擴展的數據結構。

舉個例子,如果它是一個ArrayList,你可以繼續添加任意數量的點(理論上)。

我真的不明白hasPoints的方法。理想情況下,在繪製自己的同時,您應該同時進行採樣和插值,並且還可以平滑曲線。

更新:是啊,如果是這樣的話,那麼你只能嘗試註冊一個點只有當它感動,說4個以上的像素,然後以某種方式插值並通過之間的平滑它繪製曲線上一個和下一個點。而且,我想你也需要捕獲y點。

+0

好點。這個數組的接收器(libpd,Android的Pure Data)需要一個固定大小的數組,所以我想捕獲一個數組。可能我可以捕獲一個任意樣本,然後對其進行採樣?就xHasPoint而言,我認爲我只希望用戶每x座標繪製一個點。 – anthropomo

+0

用更多的點數更新了我的答案。 –

+0

我還有很多事要解決。例如,如果我能夠獲得足夠大的初始樣本,也許我可以使用線性插值。這對於正方形和三角形音頻波甚至可能是一個優點。提前,並將其標記爲答案。 – anthropomo

1

您的邏輯可能存在問題。因爲一次只有一個觸摸事件引發,即ACTION_DOWN或ACTION_MOVE。所以你寫在if()塊中的邏輯將不會被執行。

+0

是的。我打字太快了。 – anthropomo