/* File name 8-1.c */
#include <stdio.h>
#include <math.h>
#define BASE 255
#define SIZE 512
#define BOUNDS 1.0
#define EPSILON 1.0E-7
#define DUMMY 2.0
int hantei(double x, double y);
double cabs(double x, double y);
main()
{
double interval=2*BOUNDS/SIZE;
double x;
double y= BOUNDS;
int i, j, result;
printf("P3\n%d %d\n%d\n", SIZE, SIZE, BASE);
for(i=0; i < SIZE; i++){
x = -BOUNDS;
for(j=0; j < SIZE; j++){
result=hantei(x,y);
if (result==1)
printf("%d %d %d\n", 0, 0, BASE);
else if (result == 2)
printf("%d %d %d\n", 0, BASE, 0);
else if (result == 3)
printf("%d %d %d\n", BASE, 0, 0);
else
printf("%d %d %d\n", 0, 0, 0);
x += interval;
}
y -= interval;
}
}
int hantei(double x, double y)
{
double u=DUMMY;
double v=DUMMY;
double nextu=x;
double nextv=y;
double denom;
if (x==0 && y==0) return 0;
while(cabs(nextu-u, nextv-v)>EPSILON){
u=nextu;
v=nextv;
denom=3*(u*u*u*u+2*u*u*v*v+v*v*v*v);
nextu=(2.0*u/3.0) + (u*u-v*v)/denom;
nextv=(2.0*v/3.0)-2*u*v/denom;
}
if (fabs(u-1.0)< 0.5)
return 1;
else if (fabs(v-(sqrt(3)/2.0))<0.5)
return 2;
else if (fabs(v+(sqrt(3)/2.0))<0.5)
return 3;
else
return 0;
}
double cabs(double a, double b)
{
return sqrt(a*a+b*b);
}
プログラムが完成したら, 実行して見て下さい. 多量の出力が出ますので, more にリダイレクションします. 次の様になっていれば間違い無いでしょう.
e023199@cc> ./a.out|more P3 512 512 255 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 .........
プログラムは 標準出力にデータを出力しますから, ファイルに保存するには リダイレクションを使います.
e023199@cc> ./a.out > cnewton.ppm
図形を見るには, ASTEC-X で login して, ImageView でみます. root ウィンドウで右ボタンを押して, アプリケーションから ImageView を選びます. アプリケーションが起動したらファイルメニューから, cnewton.ppm というファイルを選択します.