Я делаю это задание для развлечения.
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 итераций):
Если у вас 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 = …», чтобы прояснить это, и дополнительно попросите компилятор проверить, что вы случайно не измените их впоследствии.
Других решений пока нет …