【问题标题】:Generating incomplete iterated function systems生成不完整的迭代函数系统
【发布时间】:2013-07-12 01:33:59
【问题描述】:

我做这个任务是为了好玩。

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 次迭代):

【问题讨论】:

    标签: c++ graphics fractals


    【解决方案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 声明让人很难看出这两个只是在三行代码中使用。将它们声明为“unsigned const u = ...”以明确这一点,并让编译器检查您之后不会意外修改它们。

    【讨论】:

    • 谢谢,这也是一个微妙的错误。结果不完整的原因是我忘记了“休息”;矩阵变换后。现在我开始工作了。
    猜你喜欢
    • 2013-09-03
    • 2011-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-10
    • 2010-11-28
    • 1970-01-01
    相关资源
    最近更新 更多