4 void fractalnoise(unsigned char *noise, int size, int startgrid)
6 int x, y, g, g2, amplitude, min, max, size1 = size - 1;
8 #define n(x,y) noisebuf[((y)&size1)*size+((x)&size1)]
11 noisebuf = qmalloc(size*size*sizeof(int));
12 memset(noisebuf, 0, size*size*sizeof(int));
15 // quick 1x1 case which the rest of the code can't handle
18 for (x = 0;x < size*size;x++)
19 *noise++ = (rand()&255);
23 // clear the starting grid (the rest does not need to be cleared, it will simply be overwritten)
24 for (y = 0;y < size;y += g2)
25 for (x = 0;x < size;x += g2)
27 for (;(g = g2 >> 1) >= 1;g2 >>= 1)
29 // subdivide, diamond-square algorythm (really this has little to do with squares)
31 for (y = 0;y < size;y += g2)
32 for (x = 0;x < size;x += g2)
33 n(x+g,y+g) = (n(x,y) + n(x+g2,y) + n(x,y+g2) + n(x+g2,y+g2)) >> 2;
35 for (y = 0;y < size;y += g2)
36 for (x = 0;x < size;x += g2)
38 n(x+g,y) = (n(x,y) + n(x+g2,y) + n(x+g,y-g) + n(x+g,y+g)) >> 2;
39 n(x,y+g) = (n(x,y) + n(x,y+g2) + n(x-g,y+g) + n(x+g,y+g)) >> 2;
41 // brownian motion theory
43 for (y = 0;y < size;y += g)
44 for (x = 0;x < size;x += g)
45 n(x,y) += (rand()&litude);
47 // find range of noise values
49 for (y = 0;y < size;y++)
50 for (x = 0;x < size;x++)
52 if (n(x,y) < min) min = n(x,y);
53 if (n(x,y) > max) max = n(x,y);
56 // normalize noise and copy to output
57 for (y = 0;y < size;y++)
58 for (x = 0;x < size;x++)
59 *noise++ = (n(x,y) - min) * 255 / max;