1

公式の説明はここにあります:ArrayList

しかし、それは反復を使用し、私を混乱させます。

描画ペンを作成しようとしていますが、ここで問題が発生しています。

drawings.get(i) = drawing.get(i-1);

   ArrayList <Drawing> drawings = new ArrayList <Drawing>();

   void setup(){
    size(400,400);
    background(255);
    colorMode(HSB);
   }

   void draw(){}

   void mouseDragged(){

     drawings.add(new Drawing(mouseX,mouseY));

     for(int i = drawings.size()-1;i>0;i--){
       drawings.get(i) = drawing.get(i-1);
      }

     for(int i=0;i<drawings.size;i++){
       fill(c,100);
       drawings.get(i).display();}
  }


  class Drawing{
     float x,y,r;
     color c;

   Drawing(float ax,float ay){
     x=as;
     y=ay;
     r=random(2,20);
     c=color(random(100,200),255,255);
    }  

   void display(){
     fill(c,100);
     ellipse(drawing[i],r,r);}

  }

ArrayListの使い方がまだわかりません。誰か知っている?

ありがとうございました。

4

1 に答える 1

1

あなたは反復があなたを混乱させると言いました。単純なforループです。それらを理解するのに問題がある場合、それらは他のステートメントと比較して難しく見えますが、それはループが一度に3つのことを行うからです。

  1. カウンターを初期化する
  2. 現在のカウンター値を制限と比較します(ブール式)
  3. カウンターをインクリメントします

コードには、次の2つのループがあります。

 for(int i = drawings.size()-1;i>0;i--)

for(int i=0;i<drawings.size();i++)

したがって、最初のループは逆方向にカウントされます。

  1. カウンターは最大値(i = drawings.size())で初期化されます
  2. 制限は1(i>0
  3. カウンターはデクリメントされます(i--)(または必要に応じて-1ずつインクリメントされます)

drawing.size()は、配列リストのサイズを取得するだけです(配列のlengthプロパティと同様)。つまり、簡単に言うと、最初のループはリストに追加された最後の要素(最新)から始まり、インデックスはリストサイズ-1に等しく、2番目の要素(インデックスは1)で停止します(配列/配列のため)リストは0からインデックス作成を開始します)。

2番目のループは、0から配列リストのサイズまでカウントされるため、より単純です。基本的に、リストのすべての要素は、格納されている順序(古いものから新しいものへ)になります。

最初のループでは、最初の要素を除くすべての要素を1つずつシフトしているように見えます。あなたはそのようにそれを試してみるべきです:

  for (int i = drawings.size()-1;i>0;i--) {
    Drawing current  = drawings.get(i);//store the current drawing
    Drawing previous = drawings.get(i-1);//store the previous drawing
    current  = previous;//point the current to the previous
  }

そして、ここにエラーが修正されたコードリストがあります:

ArrayList <Drawing> drawings = new ArrayList <Drawing>();
color c = color(0,0,192);

void setup() {
  size(400, 400);
  background(255);
  colorMode(HSB);
}

void draw() {
}

void mouseDragged() {

  drawings.add(new Drawing(mouseX, mouseY));

  for (int i = drawings.size()-1;i>0;i--) {
    Drawing current  = drawings.get(i);//store the current drawing
    Drawing previous = drawings.get(i-1);//store the previous drawing
    current  = previous;//point the current to the previous
    //drawings.get(i) = drawing.get(i-1);
  }

  for (int i=0;i<drawings.size();i++) {
    fill(c, 100);
    drawings.get(i).display();
  }
}


class Drawing {
  float x, y, r;
  color c;

  Drawing(float ax, float ay) {
    x=ax;
    y=ay;
    r=random(2, 20);
    c=color(random(100, 200), 255, 255);
  }  

  void display() {
    fill(c, 100);
//    ellipse(drawing[i], r, r);
    ellipse(x,y,r,r);
  }
}

アップデート

逆ループのため、次のように、図面のリストを保存してオフセットする必要があると想定しました。

ArrayList <Drawing> drawings = new ArrayList <Drawing>();

void setup() {
  size(400, 400);
  smooth();
  noStroke();
  colorMode(HSB);
}

void draw() {
  background(0,0,255);
  for (int i=0;i<drawings.size();i++){
    drawings.get(i).display();
  }
}

void mouseDragged() {

  for (int i = drawings.size()-1;i>0;i--) {
    drawings.get(i).copy(drawings.get(i-1));
  }
  drawings.add(0,new Drawing(mouseX, mouseY));

}


class Drawing {
  float x, y, r;
  color c;

  void copy(Drawing copyFrom){
    x = copyFrom.x;
    y = copyFrom.y;
    r = copyFrom.r;
    c = copyFrom.c;
  }

  Drawing(float ax, float ay) {
    x=ax;
    y=ay;
    r=random(2, 20);
    c=color(random(100, 200), 255, 255);
  }  

  void display() {
    fill(c, 100);
    ellipse(x,y,r,r);
  }
}

距離に基づいて描画オブジェクト間に線を描画したいだけの場合は、逆ループなしでそれを行うことができます。

ArrayList <Drawing> drawings = new ArrayList <Drawing>();

void setup() {
  size(400, 400);
  background(255);
  colorMode(HSB);
}

void draw() {
}

void mouseDragged() {

  drawings.add(new Drawing(mouseX, mouseY));

  for (int i=0;i<drawings.size();i++) {
    Drawing curr  = drawings.get(i);
    if(i > 0){                                    //if the current index is greather than 0
      Drawing prev = drawings.get(i-1);           //we can access the previous
      if(dist(curr.x,curr.y,prev.x,prev.y) < 20) {//check the distance, if it's within a certain threshold
        line(curr.x,curr.y,prev.x,prev.y);        //draw the line
      }
    }
    curr.display();
  }
}


class Drawing {
  float x, y, r;
  color c;

  Drawing(float ax, float ay) {
    x=ax;
    y=ay;
    r=random(2, 20);
    c=color(random(100, 200), 255, 255);
  }  

  void display() {
    fill(c, 100);
    ellipse(x,y,r,r);
  }
}

実際、背景をクリアしていないので、リストはまったく必要ありません。必要なのは前のDrawingオブジェクトへの参照だけなので、距離を確認して線を引くことができます。

Drawing prev;//variable to store the previous drawing

void setup() {
  size(400, 400);
  background(255);
  colorMode(HSB);
}

void draw() {
}

void mouseDragged() {

  Drawing curr = new Drawing(mouseX, mouseY);//create a new drawing
  curr.display();//display it
  if(prev != null){//check if there was a previous one
    if(dist(curr.x,curr.y,prev.x,prev.y) < 20) {//if so, check if the distance is within the threshold
       line(curr.x,curr.y,prev.x,prev.y);//then simply draw a line
    }
  }
  prev = curr;

}


class Drawing {
  float x, y, r;
  color c;

  Drawing(float ax, float ay) {
    x=ax;
    y=ay;
    r=random(2, 20);
    c=color(random(100, 200), 255, 255);
  }  

  void display() {
    fill(c, 100);
    ellipse(x,y,r,r);
  }
}

HTH

于 2012-09-21T14:52:30.837 に答える