-2

私は処理が初めてで、600px x 600px のキャンバスがorange[]パレットからランダムな色の 50px の四角形で塗りつぶされているスケッチを作成しています。draw()ブロックのランダムな形成は、後で追加するいくつかの条件で正しく動作するために、関数内に配置する必要があります。

私が得ているエラーはArrayIndexOutOfBoundsException: 12 on this line です:

randomSize[varCreator] = sIncrement[int(random(0,sIncrement.length-1))];

このエラーが発生する理由がわかりません。私は関連する質問を調べましたが、おそらく私がとても新しいからかもしれませんが、理解できません:

int x; //x coordinate
int y; //y coordinat
int s = 50; //rect size
int wide = 600; //canvas width
int tall = 600; //canvas height
int[] sIncrement = new int[12];//{s, s*2, s*3, s*4, s*5, s*6};

//colors
int[] oranges = {
  #773600, #5f3613, #552700, #9c5215, #9c5c26
};
int[] blues = {
  #004848, #0c3939, #003333, #107979, #1e7979
};
int[] palette = oranges;//holds current color pallete

//random
int fillColor = palette[int(random(0, palette.length))]; //random starting fill color
int changeColor = palette[int(random(0, palette.length))]; //random new color
int[] randomSize = new int[sIncrement.length]; //array of lots of random s values to place newly color changed blocks


//setup
void setup(){
  size(wide, tall);
  background(255);
  noStroke();
  frameRate(24);

  /*fills sIncrement array with incrementing s values (i.e. if s = 50 then array 
   contains 50, 100, 150, etc...) from 0 to canvas width for use in a conditional statement*/
  for(int i = 0; i <= sIncrement.length-1; i++){
    sIncrement[i] = s*i;
  }

 //creates multiple randomSize variables for if() x or y == randomSize[varCreator] 
 for(int varCreator = 0; varCreator <= (width/s)+(height/s); varCreator++){
   randomSize[varCreator] = sIncrement[int(random(0,sIncrement.length-1))];
 }
}

//draw
void draw(){
  fill(fillColor); //selects random color from palette

  //draws grid colored boxes with s size
  for (y = 0; y <= height; y+= s) {
    for (x = 0; x <= width; x+= s) {
      if(x == sIncrement[randomSize[1]] && y == sIncrement[randomSize[3]]){
        fill(changeColor); //selects random color from palette
        rect(x, y, s, s);
      }

      else{
      fill(fillColor);
     // fill(palette[int(random(0, palette.length))]); //selects random color from palette
      rect(x, y, s, s);
      }
    }
  }
}
4

2 に答える 2

1

コードをたどると、次のようになります。

int[] sIncrement = new int[12];                    // sIncrement initialized with size 12
int[] randomSize = new int[sIncrement.length];     // randomSize initialized with size 12
for(... ; varCreator <= (width/s)+(height/s); ...) // varcreator <= 24!
randomSize[varCreator] = ...                       // Problem line

varcreator >= 12範囲外の配列インデックスを取得する場合。そこから始めて、コードを修正します。

于 2013-02-11T03:17:23.933 に答える
1

array の要素にアクセスしていますrandomSize。この配列の長さはどれくらいですか? その宣言を見てみましょう:

int[] randomSize = new int[sIncrement.length];

したがって、配列と同じ長さsIncrementです。少し前に見てみると:

int[] sIncrement = new int[12];

の長さsIncrement、したがって の長さrandomSizeは 12 です。

このコードでは:

for(int varCreator = 0; varCreator <= (width/s)+(height/s); varCreator++){
    randomSize[varCreator] = sIncrement[int(random(0,sIncrement.length-1))];
}

配列内の要素にアクセスするために使用するインデックスは、0 から までrandomSizeの変数にあります。の長さは 12 であるため、0 から 11 までのインデックスのみを使用して要素にアクセスできます。そうしないと、報告しているエラーが発生します。varCreator(width/s)+(height/s)randomSize

したがって、(width/s)+(height/s)12 以上であってはなりません。これはいくらですか ?

あなたのコードにはどこでwidthheightが宣言されているかを教えてくれるものは何もないので、そこが私たちが立ち往生している場所です。s私たちはそれが50であることしか知りません。

しかし、これらの変数 と がwideありtall、それぞれが 600 に等しいです。コードのどこかに と があることを大雑把に推測して推定しwidth = wideますheight = tall

そう(width/s)+(height/s) = (600/50) + (600/50) = 12 + 12 = 24

それでおしまい。varCreator0 から 24 (含まれる) になるため、配列の境界を使い果たします。

于 2013-02-11T03:20:24.617 に答える