チュートリアル | (トピック一覧へ戻る) |
import processing.opengl.*; import igeo.*; size( 480, 360, IG.GL ); int num = 100; IVec[] cpts1 = new IVec[num]; for(int i=0; i < num; i++){ cpts1[i] = new IVec(i*2-50, 40, IRandom.get()*10); } new ICurve(cpts1).clr(1.,0,0); IVec[][] cpts2 = new IVec[num][2]; for(int i=0; i < num; i++){ cpts2[i][0] = new IVec(i*2-50,-30, IRandom.get()*5*(sin(i*0.2)+1) ); cpts2[i][1] = new IVec(i*2-50, 30, IRandom.get()*5*(sin(i*0.2)+1) ); } new ISurface(cpts2);
乱数の生成する範囲はメソッドで指定することもできます。 整数の乱数を生成するには、IRandom.getInt(int,int)を用います。 引数には最小と最大の乱数の範囲を指定します。 同様に、IRandom.get(double,double)では2つの引数で範囲を指定し、 double型の乱数を返します。
import processing.opengl.*; import igeo.*; size( 480, 360, IG.GL ); for(int i=0; i < 40; i++){ int ynum = IRandom.getInt(10, 40); for(int j=0; j < ynum; j++){ int znum = IRandom.getInt(20-j, 40-j); for(int k=0; k < znum; k++){ double size = IRandom.get(2.5, 10.0); double x=i*10, y=j*10, z=k*2; new ISurface(x, y, z, x+size, y, z, x+size, y+size, z, x, y+size, z) .clr(k*0.05, k*0.05, 0); } } }
import processing.opengl.*; import igeo.*; size( 480, 360, IG.GL ); for(int i=0; i < 1000; i++ ){ IVec pos = IRandom.pt(-70,-70,-30,70,70,30); new IPoint(pos); }
乱数のシードを設定したい場合はIRandom.init(long) を利用します。 また、実行のたびに異なる乱数を生成したい場合は、 IRandom.initByTime()メソッドを用います。
import processing.opengl.*; import igeo.*; size( 480, 360, IG.GL ); IRandom.initByTime(); IVec[] pts = new IVec[100]; for(int i=0; i < pts.length; i++ ){ pts[i] = IRandom.pt(-90,-90,-60,90,90,60); } new ICurve(pts,3).clr(1.,.3,0);
IRandom.initByTime()を用いると 毎回異なる乱数の振る舞いになりますが、 もしもその中で気に入ったものがあっても、同じ振る舞いが起きることはほぼないので、 振る舞いを再現したい場合はIRandom.init(long)メソッドを 毎回異なるシード数で実行し、気に入ったものがあれば同じシード数をまた設定 することで再現されます。
import processing.opengl.*; import igeo.*; size( 480, 360, IG.GL ); for(int i=0; i < 1000; i++ ){ new IPoint(IRandom.pt(-70,-70,-30,0,70,30)) .clr(IRandom.clr()); new IPoint(IRandom.pt(0,-70,-30,70,70,30)) .clr(IRandom.gray()); }
以下はランダムな点で生成された三角形の面にランダムな色を設定した例です。
import processing.opengl.*; import igeo.*; size( 480, 360, IG.GL ); IVec pt = new IVec(30,30,0); for(int i=0; i < 100; i++){ new ISurface(IRandom.pt(-50,-50,0,0,0,50), IRandom.pt(-50,-50,0,0,0,50),pt) .clr(IRandom.clr()); }
import processing.opengl.*; import igeo.*; size( 480, 360, IG.GL ); for(int i=0; i < 50; i++){ for(int j=0; j < 50; j++){ double x = i*4-100, y = j*4-100; // 50% probability to be executed if(IRandom.percent(50)){ new ISurface(x,y,0,x+2,y,0,x+2,y,50).clr(1.,1.,1.); } // 50% of the rest ( = 25%) else if(IRandom.percent(50)){ new ISurface(x,y,0,x+2,y,0,x+2,y,20).clr(0,1.,1.); } // 50% of the rest of the rest ( = 12.5%) else if(IRandom.percent(50)){ new ISurface(x,y,0,x+2,y,0,x+2,y,10).clr(1.,0,0); } } }