0

Android画面でユーザーが手描きした線を配列に「サンプリング」したいと思います。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;
    }
}

私の質問は、この問題に対するより良いアプローチを提案できますか? 大量のデータを推定する必要があると予想しています...最後に配列をループし、null インデックスを割り当てて、最も近い非 null 値からの平均値を割り当てます。

一方、これが間違っていないように思われる場合、重要な全体像に関する考慮事項を見逃しているのでしょうか?

4

2 に答える 2

1

ロジックに問題がある可能性があります。一度に 1 つのタッチ イベント、つまり ACTION_DOWN または ACTION_MOVE のみが発生するためです。したがって、if() ブロックに記述したロジックは実行されません。

于 2012-11-16T07:26:31.503 に答える
1

唯一の問題は、配列がいっぱいになると、ポイントを追加し続けることができないことです。成長可能なデータ構造を使用することをお勧めします。

たとえば、それがArrayListの場合、(理論的には)任意の数のポイントを追加し続けることができます。

メソッド hasPoints がよくわかりません。理想的には、自分自身を描画している間、同時にサンプリングと補間を行い、場合によっては曲線を滑らかにする必要があります。

更新:ええ、その場合は、ポイントが移動したとき、たとえば 4 ピクセル以上の場合にのみポイントを登録してから、前のポイントと次のポイントの間で曲線を滑らかにすることで、補間して曲線を描くことができます。また、y点もキャプチャする必要があると思います。

于 2012-11-16T06:50:05.340 に答える