私は楽しみのためにこの課題をやっています。
http://groups.csail.mit.edu/graphics/classes/6.837/F04/assignments/assignment0/
どのように表示されるかを確認したい場合は、サイトにサンプル出力があります。これには、反復関数システムが含まれます。そのアルゴリズムは、割り当てに従って次のようになります。
for "lots" of random points (x0, y0)
for k=0 to num_iters
pick a random transform fi
(xk+1, yk+1) = fi(xk, yk)
display a dot at (xk, yk)
実装で問題が発生しています。これは次のとおりです。
void IFS::render(Image& img, int numPoints, int numIterations){
Vec3f color(0,1,0);
float x,y;
float u,v;
Vec2f myVector;
for(int i = 0; i < numPoints; i++){
x = (float)(rand()%img.Width())/img.Width();
y = (float)(rand()%img.Height())/img.Height();
myVector.Set(x,y);
for(int j = 0; j < numIterations;j++){
float randomPercent = (float)(rand()%100)/100;
for(int k = 0; k < num_transforms; k++){
if(randomPercent < range[k]){
matrices[k].Transform(myVector);
}
}
}
u = myVector.x()*img.Width();
v = myVector.y()*img.Height();
img.SetPixel(u,v,color);
}
}
これは、入力行列からランダムな変換を選択する方法です。
fscanf(input,"%d",&num_transforms);
matrices = new Matrix[num_transforms];
probablility = new float[num_transforms];
range = new float[num_transforms+1];
for (int i = 0; i < num_transforms; i++) {
fscanf (input,"%f",&probablility[i]);
matrices[i].Read3x3(input);
if(i == 0) range[i] = probablility[i];
else range[i] = probablility[i] + range[i-1];
}
私の出力は、シェルピンスキー三角形の始まりのみを示しています (1000 ポイント、1000 反復):
私のドラゴンは良くなりましたが、まだ作業が必要です (1000 ポイント、1000 回の反復):