0

私は楽しみのためにこの課題をやっています。

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 回の反復):

ドラゴン

4

1 に答える 1

1

RAND_MAX=4 でピクチャ幅が 3 の場合、rand() からの [0,1,2,3,4] のような均等に分散されたシーケンスは、モジュロ コードによって [0,1,2,0,1] にマップされます。 、つまり、いくつかの数字がより頻繁に発生します。RAND_MAX を下回る目標範囲の最大倍数、つまり ((RAND_MAX / 3) * 3) を上回る数値を切り取る必要があります。この制限を確認して、もう一度 rand() を呼び出してください。

いくつかの場所でそのエラーを修正する必要があるため、ユーティリティ関数を作成することを検討してください。次に、変数のスコープを縮小します。u,v 宣言により、これら 2 つが 3 行のコードで使用されていることがわかりにくくなっています。それらを「unsigned const u = ...」として宣言して、これを明確にし、後で誤って変更しないようにコンパイラーにチェックさせます。

于 2013-07-12T05:38:48.763 に答える