あなたは反復があなたを混乱させると言いました。単純なforループです。それらを理解するのに問題がある場合、それらは他のステートメントと比較して難しく見えますが、それはループが一度に3つのことを行うからです。
- カウンターを初期化する
- 現在のカウンター値を制限と比較します(ブール式)
- カウンターをインクリメントします
コードには、次の2つのループがあります。
for(int i = drawings.size()-1;i>0;i--)
と
for(int i=0;i<drawings.size();i++)
したがって、最初のループは逆方向にカウントされます。
- カウンターは最大値(
i =
drawings.size()
)で初期化されます
- 制限は1(
i>0
)
- カウンターはデクリメントされます(
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