Processingで波紋を描く その2

波紋が現れるプログラム

 今回もProcessingで波紋が現れるプログラムを書いてみたよ。
 動いている様子はこちら
 実際に動かしたい方は、ソースコードをProcessingにコピペして動かしてみてね。

内容

・クリックした場所に波紋が現れる
・ランダムに波紋が現れる
・大文字S (Shift + s)を押すと画像を保存

 前回はクリックした場所に波紋が現れるプログラムだったが、今回は自動的にランダムな位置とタイミングで波紋が現れる関数を追加した。画面をクリックすれば前回同様そこに波紋が現れる。
 波紋の色は通常の色の他に、オパールをイメージした色や虹色に変更できる。Hamon、Opal、Rainbowのどれかひとつだけコメントアウトを解除し、どの色にするか設定する。以下のソースコードでは通常の波紋の色に設定している。

通常の波紋の色

Opalを選択した場合

Rainbowを選択した場合
 

動画はTwitterから




ソースコード

 以下のソースコードををProcessingにコピペすれば動くと思うので、動いている様子を見たい方は試してみてね。
 テキストのコピペではなく、全選択した後に右クリックで”HTMLとしてコピー”にするときれいにソースコードをコピペできると分かった。行番号も載せたいのだけど誰かやり方教えて下さいな。

-----以下ソースコード-----
/*
波紋

・クリックした場所に波紋が現れる
・ランダムに波紋が現れる
・大文字S (Shift + s)を押すと画像を保存



<関数目次>
setup()
mousePressed()
AutoM()
saveImage()
keyPressed()
draw()

*/



int[][] hamon; //波紋の配列 hamon[i][0]:x座標,hamon[i][1]:y座標,hamon[i][2]:サイズ
int cnt=0;     //波紋カウンタ
int N=48;      //波紋の数 (同時に存在できる波紋の数:配列の数)
int dai=500;   //波紋がある程度のサイズdaiになったら輪郭の透明度を徐々に落としてフェードアウト

int cnt2=5;    //発生間隔カウンタ
int aa=10;     //発生間隔

int colsu;     //色数
color[] co;    //輪郭の色の配列
color bg;      //背景色

/*セットアップ関数
  関数目次へ*/
void setup(){
  int i;
  
  hamon=new int[N][3];   //波紋のN×3配列
  
  //波紋の配列の初期化
  for(i=0;i<N;i++){
    hamon[i][0]=hamon[i][1]=hamon[i][2]=0;
  }
  
  bg=color(128,196,255); //背景色を設定
  
  //コメントアウトを解除して波紋の色を指定する
  
  /*Hamon*/
  colsu=1;
  co=new color[colsu];
  co[0]=color(255,128);
  /**/
  
  /*Opal
  colsu=5;
  co=new color[colsu];
  co[0]=color(#ffffaa);
  co[1]=color(#ffbbff);
  co[2]=color(#aaffff);
  co[3]=color(255);
  co[4]=color(255);
  */
      
  /*Rainbow
  colsu=6;
  co=new color[colsu];
  co[0]=color(#ff0000);
  co[1]=color(#ffff00);
  co[2]=color(#00ff00);
  co[3]=color(#00ffff);
  co[4]=color(#0000ff);
  co[5]=color(#ff00ff);
  */
  
  size(1500,500);   //画面サイズを1500×500ピクセルに設定
  background(bg);
  
  fill(255,0);      //塗りつぶしを透明に
  stroke(0);
  strokeWeight(3);
  
}//end:setup()



/*マウスがクリックされると呼び出される 
  クリックした位置に波紋
関数目次へ*/
void mousePressed(){

  hamon[cnt][0]=mouseX;       //波紋の座標をクリックした位置に設定
  hamon[cnt][1]=mouseY;       //波紋の座標をクリックした位置に設定
  hamon[cnt][2]=1;            //波紋のサイズを1に:波紋発生
  cnt++;                      //波紋のカウンタをインクリメント
  if(cnt==N) cnt=0;           //波紋カウンタcntが波紋の個数Nに達したら0にリセット
  
  println("cnt: " + cnt);
  
}//end:mousePressed()


/*波紋をランダムな位置に発生させる関数AutoM()
  関数目次へ*/
void AutoM(){

  //波紋の座標をランダムに設定
  hamon[cnt][0]=int(random(width));     //波紋の座標をランダムに設定:x座標を画面の幅widthの範囲内からランダムに設定
  hamon[cnt][1]=int(random(height));    //波紋の座標をランダムに設定:y座標を画面の高さheightの範囲内からランダムに設定
  hamon[cnt][2]=1;            //波紋のサイズを1に:波紋発生
  cnt++;                      //波紋のカウンタをインクリメント
  if(cnt==N) cnt=0;           //波紋カウンタcntが波紋の個数Nに達したら0にリセット
  
  println("cnt: " + cnt);
  
}//end:AutoM()




/*画像を保存する関数
関数目次へ*/
void saveImage(){
  //"Hamon_年_月_日_時_分_秒.png"というファイル名
  String [] ymdhms={str(year()),str(month()),str(day()),str(hour()),str(minute()),str(second())};
  String ym_ = join(ymdhms,"_");
  
  save("Hamon_" + ym_ + ".png");
}//end:saveImage()



/*キーが押されたら呼び出される関数
関数目次へ*/
void keyPressed(){
  
  //もし大文字のSが押されたら画像を保存
  if(key=='S'){
    saveImage();     //画像を保存する関数saveImage()で画像を保存
  }
  
}//end:keyPressed()


/*関数目次へ*/
void draw(){
  int i,to;         background(bg);      //波紋をランダムに発生させる際の発生間隔   cnt2++;   //発生間隔カウンタcnt2が発生間隔aaと一致したら波紋発生   if(cnt2==aa){     AutoM();                  //関数AutoM()で波紋を新たに生成     aa=int(random(20)+1)*3; //次回の発生までの間隔aaを設定     cnt2=0;                   //カウンタリセット   }      //配列に格納された波紋を順番に処理   for(i=0;i<N;i++){          to=255;     //波紋がある程度のサイズdaiになったら輪郭の透明度を徐々に落としてフェードアウト     if(hamon[i][2]>dai){       to=255-(hamon[i][2]-dai);       if(0>=to) hamon[i][2]=0; //透明度が0以下になった(消えた)ら波紋のサイズを0に     }          stroke(co[i%colsu],to); //波紋の色を格納した配列co[]から順番に指定          //波紋のサイズが0より大きいなら波紋を表示     if(hamon[i][2]>0){       ellipse(hamon[i][0],hamon[i][1],hamon[i][2],hamon[i][2]/2); //波紋を表示       hamon[i][2]++;                                               //波紋nのサイズをインクリメント:徐々に広がる     }        }//for(i=0;i<N;i++)       }//end:draw()
/*→関数目次へ*/

コメント