波紋が現れるプログラム
今回もProcessingで波紋が現れるプログラムを書いてみたよ。
動いている様子はこちら。
実際に動かしたい方は、ソースコードをProcessingにコピペして動かしてみてね。
内容
・クリックした場所に波紋が現れる
・ランダムに波紋が現れる
・大文字S (Shift + s)を押すと画像を保存
波紋の色は通常の色の他に、オパールをイメージした色や虹色に変更できる。Hamon、Opal、Rainbowのどれかひとつだけコメントアウトを解除し、どの色にするか設定する。以下のソースコードでは通常の波紋の色に設定している。
![]() |
| 通常の波紋の色 |
![]() |
| Opalを選択した場合 |
![]() |
| Rainbowを選択した場合 |
動画はTwitterから
#Processing で波紋を描くプログラム書いてみた・ランダムに波紋が現れる・クリックしたところにも波紋が現れる・大文字S(Shift+s)で画像を保存めちゃ横長画面で見難くてごめんね↓詳細やらソースコードやらはこちらhttps://t.co/pL11KaT00x pic.twitter.com/uvBKVeTHBm— お豆 (@Gohan_Shiokara) July 22, 2022
ソースコード
以下のソースコードをを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()
/*→関数目次へ*/



コメント
コメントを投稿