gpt4 book ai didi

c++ - 生成不完整的迭代函数系统

转载 作者:行者123 更新时间:2023-11-28 07:31:24 25 4
gpt4 key购买 nike

我做这个作业是为了好玩。

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];

}

我的输出仅显示 Sierpinski 三角形的起点(1000 个点,1000 次迭代):

sierpinski

我的龙更好,但仍需要一些工作(1000 点,1000 次迭代):

dragon

最佳答案

如果 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 = ...”以明确这一点,并另外让编译器检查您之后是否不小心修改了它们。

关于c++ - 生成不完整的迭代函数系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17606208/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com