0

このコードの理解に取り組んでいる Processing の初心者:

 import com.onformative.leap.LeapMotionP5;
    import java.util.*;

    LeapMotionP5 leap;
    LinkedList<Integer> values;

    public void setup() {
      size(800, 300);
      frameRate(120);  //Specifies the number of frames to be displayed every second
      leap = new LeapMotionP5(this);
      values = new LinkedList<Integer>();
      stroke(255);
    }

    int lastY = 0;

    public void draw() {
      **translate(0, 180)**; //(x, y, z)
      background(0);
      if (values.size() >= width) {
        values.removeFirst();
      }

      values.add((int) leap.getVelocity(leap.getHand(0)).y);
      System.out.println((int) leap.getVelocity(leap.getHand(0)).y);
      int counter = 0;
     ** for (Integer val : values)** {
        **val = (int) map(val, 0, 1500, 0, height);**
        line(counter, val, counter - 1, lastY);
        point(counter, val);
        lastY = val;
        counter++;
      }

     ** line(0, map(1300, 0, 1500, 0, height), width, map(1300, 0, 1500, 0, height)); //(x1, y1, x2, y2)**
}

基本的には、Leap Motion センサーを使用して y 軸上で検出された動きのグラフを描画します。出力は次のようになります。スクリーンショット

最終的には、y軸だけでなく3軸すべてで速度ではなく振幅を同時に検出する、これと同様のことを行う必要があります。

Map と Translate の使用は、私を本当に混乱させます。Processing の Web サイトでこれらの関数の定義を読んだので、それらが何であるかと構文はわかっていますが、理解できないのはその理由です?! (これは間違いなく最も重要な部分です。

これら 2 つの関数を使用する理由を説明する簡単な例を誰かが提供できるかどうかを尋ねています。たとえば、データ foo、y、および x を使用して A、B、および C を実行する必要があるプログラムがある場合、A、B、および C であるため、Map または Translate を使用します。

プログラミングガイドはこの重要な事実を見落としがちだと思いますが、関数を真に理解することは私にとって非常に重要です。

説明のボーナスポイント:

for (Integer val : values) and LinkedList<Integer> values;(これらの処理Webサイトでドキュメントを見つけることができません)

ありがとう!

4

1 に答える 1

1

まず、最も簡単な方法を実行します。LinkedListは に似たデータ構造でArrayList、こちらの方がなじみがあるかもしれません。そうでない場合は、挿入および削除できる値のリスト (山括弧の間の型、この場合は整数) にすぎません。内部は少し複雑ですが、Processing のドキュメントに記載されていない場合は、Java 自体に組み込まれていることは間違いありません ( java ドキュメント)。

この行:

for (Integer val : values)

これは「for-each」または「foreach」ループと呼ばれ、インターネット上で非常に優れた説明がたくさんありますが、ここでは簡単に説明します。いくつかのリスト (おそらく LinkedList、おそらく ArrayList など) があり、すべての要素で何かをしたい場合は、次のようにすることができます。

for(int i = 0; i < values.size(); i++){
    println(values.get(i)); //or whatever
    println(values.get(i) * 2);
    println(pow(values.get(i),3) - 2*pow(values.get(i),2) + values.get(i));
}

各要素で多くの操作を行っている場合、毎回書き出すのはすぐに面倒になりvalues.get(i)ます。values.get(i)解決策は、ループの開始時にいくつかの変数にキャプチャし、代わりにそれをどこでも使用することです。ただし、これは 100% エレガントではないため、Java にはこれを行う組み込みの方法、つまり for-each ループがあります。コード

for (Integer val : values){
    //use val
}

と同等です

for(int i = 0; i < values.size(); i++){
    int val = values.get(i);
    //use val
}

うまくいけば、それは理にかなっています。

map() 1 つの線形システムの数値を取り、それを別の線形システムにマッピングします。私が邪悪な教授で、学生に 0 から 100 までのランダムな成績を与えたいと思ったと想像してください。0 から 1 までのランダムな小数を返す関数があるので、これでmap(rand(),0,1,0,100);数値が変換されます。この例では、100 を掛けるだけで同じ結果が得られますが、通常はそれほど簡単ではありません。この場合、センサーの読み取り値は 0 から 1500 の間ですが、その値を直接プロットすると、画面からはみ出すことがあります。したがって、それを適切なスケールにスケーリングする必要があります。読み取り値の最大値は 1500 です。おそらく、最大のグラフの高さを画面の端に合わせたいと考えています。

あなたの設定には詳しくありませんが、測定値が負になる可能性があるようです。つまり、画面からグラフ化される可能性もあります。より良い解決策は、読み取り値を -1500,1500 から 0,height にマッピングすることですが、別の方法を選択したようです。処理中に描画関数を呼び出すと (例: )、 (0,0) からpoint(x,y)の (x,y)オフセットでピクセルが描画されます。(0,0) に対して相対的に描画したくない場合があるため、このtranslate()関数を使用すると、相対的に描画する対象を変更できます。この場合、移動により、画面の端ではなく中央のどこかにポイント (x,0) をプロットできます。

それが役立つことを願っています!

于 2013-12-10T21:03:58.547 に答える