Генерация неполных итеративных систем функций

Я делаю это задание для развлечения.

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 итераций):

Дракон

0

Решение

Если у вас RAND_MAX = 4 и ширина изображения 3, равномерно распределенная последовательность, такая как [0,1,2,3,4] из rand (), будет отображена в [0,1,2,0,1] вашим кодом по модулю т.е. некоторые числа будут встречаться чаще. Вам необходимо обрезать те числа, которые превышают наибольшее кратное целевого диапазона, который ниже RAND_MAX, то есть выше ((RAND_MAX / 3) * 3). Просто проверьте это ограничение и снова вызовите rand ().

Поскольку вы должны исправить эту ошибку в нескольких местах, подумайте о написании служебной функции. Затем уменьшите область действия ваших переменных. Объявление u, v затрудняет понимание того, что эти два слова используются только в трех строках кода. Объявите их как «unsigned const u = …», чтобы прояснить это, и дополнительно попросите компилятор проверить, что вы случайно не измените их впоследствии.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]