class Grad{
public static void main(String[] args){
int width=128, height=128;
System.out.println("P3 "+width+" "+height+" 255");
int i,j;
for(i=0;i< height;i=i+1){
for(j=0;j< width;j=j+1){
System.out.println((i*2)+" 0 "+(254-j*2));
}
}
}
}
「画面の左上(i=0, j=0)でほぼ青(0 0 254),画面の右下(i=127, j=127)で
ほぼ赤(254 0 0)」という条件は満たしているが,出力結果は,
javac mandel.java java mandel > mandel0.ppm (mandel.javaを編集.保存) javac mandel.java java mandel > mandel1.ppm (mandel.javaを編集.保存) ... javac mandel.java java mandel > mandel9.ppm (mandel.javaを編集.保存)のようにしてもできるが,直接ファイルに指定する方法を試してみる. ファイルに出力するには,まず,
java.io.PrintWriter ps=new java.io.PrintWriter(new java.io.FileWriter("mandel"+k+".ppm"));
のようにして,ファイル名("mandel"+k+".ppm")からFileWriterを作り,それ
から PrintWriterを作る.| 「作る」というのは「オブジェクトの生成」にあたり,演算子 new で実現さ れるが,この講義の範囲を超えるので詳しい説明は省略する.興味のある人は, あたりを参照すること. |
これまで,
System.out.println( 出力したい文字列 );としてきたのを,
ps.println( 出力したい文字列 );とするとファイルへの出力に変る.
| これは,変数 ps に入っているjava.io.PrintWriter型のオブジェクトのメソッド println を呼び出しているという動作だが,ここでは詳しい説明は省略する. |
出力を終えたら,ファイルを閉じる必要がある.
ps.close();を実行する.
class Mandel{
// 実数を引数(パラメタ)に持つメソッド mandel の定義
static int mandel(double x, double y){
double zr=0, zi=0,new_zr;
int i;
for(i=0;i<50;i=i+1){
if(zr*zr+zi*zi>4.0) { // |Zi|>2.0 の時は発散と判断
return i;
}
// 複素数の計算
// (zr+zi*i)*(zr+zi*i)+x+y*i=(zr*zr-zi*zi+x)+(2*zr*zi+y)*i
new_zr=zr*zr-zi*zi+x;
zi=2*zr*zi+y;
zr=new_zr;
}
return 50;
}
// 入出力関係でエラーが発生する可能性があるので,
// throws java.io.IOException をつける.
public static void main(String[] args) throws java.io.IOException{
int width=256, height=256;
int k;
for(k=0;k<10;k++){
// ファイルに出力する時は,ファイル名("mandel"+k+".ppm")から
// FileWriterを作り,それから PrintWriterを作る
java.io.PrintWriter ps=new java.io.PrintWriter(new java.io.FileWriter("mandel"+k+".ppm"));
// マンデルブロー集合を計算する範囲のスケール
// 3e-0.8k なので,kが0の時は3
double scale=3.0*Math.exp(-(double)k*0.8);
// ファイルへの出力
ps.println("P3 "+width+" "+height+" 255");
int i,j,r;
double x, y;
for(i=0;i<height;i=i+1){
for(j=0;j<width;j=j+1){
// -1.7 <= x < 0.7, -1.2 <= y < 1.2の範囲で計算
// 実数(double)から整数(int)への変換は「(double)整数式」
// のようにおこなう.
x= -1.2525 -scale*0.5+scale*((double)j/(double)width);
y= -0.3425 -scale*0.5+scale*((double)i/(double)height);
// 0 <= r <= 50の値が返る
r=mandel(x,y);
// r=50の時に青(0,0,255), r=0の時にほぼ白(250,250,250)とする.
// ファイルへの出力
ps.println((250-r*5)+" "+(250-r*5)+" 250");
}
}
// ファイルストリームを閉じる
ps.close();
}
}
}
これを実行すると,mandel0.ppm, mandel1.ppm, ..., mandel9.ppmというファ
イルができる.
convert -delay 40 mandel[0-9].ppm mandel-animation.gifのように実行すると,0.4秒間隔(-delay のパラメータは 1/100秒単位で指定)で, mandel[0-9].gif を次々に表示していく.以下のような画像が現れる.
convertコマンドは Unix マシンに slogin してから実行すると,実行も速いし,作成される gif ファイルも小さくなる