Jump to content

Perlin noise: Difference between revisions

+ D entry
(→‎{{header|Perl 6}}: better indent)
(+ D entry)
Line 5:
Either by using a dedicated library or by implementing the algorithm, show that the Perlin noise (as defined in 2002 in the java implementation below) of the point in 3D-space with coordinates 3.14, 42, 7 is 0.13691995878400012.
 
 
=={{header|D}}==
<lang d>import std.stdio, std.math;
 
struct PerlinNoise {
private static double fade(in double t) pure nothrow {
return t ^^ 3 * (t * (t * 6 - 15) + 10);
}
 
private static double lerp(in double t, in double a, in double b)
pure nothrow {
return a + t * (b - a);
}
 
private static double grad(in ubyte hash,
in double x, in double y, in double z)
pure nothrow {
// Convert lo 4 bits of hash code into 12 gradient directions.
immutable h = hash & 0xF;
immutable double u = (h < 8) ? x : y,
v = (h < 4) ? y : (h == 12 || h == 14 ? x : z);
return ((h & 1) == 0 ? u : -u) + ((h & 2) == 0 ? v : -v);
}
 
static immutable ubyte[512] p;
 
pure nothrow static this() {
static immutable ubyte[256] permutation = [151,160,137,91,90,
15,131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,
8,99,37,240,21,10,23,190,6,148,247,120,234,75,0,26,197,62,
94,252,219,203,117,35,11,32,57,177,33,88,237,149,56,87,174,
20,125,136,171,168,68,175,74,165,71,134,139,48,27,166,77,
146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,
46,245,40,244,102,143,54,65,25,63,161,1,216,80,73,209,76,
132,187,208,89,18,169,200,196,135,130,116,188,159,86,164,
100,109,198,173,186,3,64,52,217,226,250,124,123,5,202,38,
147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,
189,28,42,223,183,170,213,119,248,152,2,44,154,163,70,221,
153,101,155,167,43,172,9,129,22,39,253,19,98,108,110,79,
113,224,232,178,185,112,104,218,246,97,228,251,34,242,193,
238,210,144,12,191,179,162,241,81,51,145,235,249,14,239,
107,49,192,214,31,181,199,106,157,184,84,204,176,115,121,
50,45,127,4,150,254,138,236,205,93,222,114,67,29,24,72,
243,141,128,195,78,66,215,61,156,180];
 
// Two copies of permutation.
p[0 .. permutation.length] = permutation[];
p[permutation.length .. $] = permutation[];
}
 
static double opCall(in double x0, in double y0, in double z0)
pure nothrow {
// Find unit cube that contains point.
immutable ubyte X = cast(int)x0.floor & 0xFF,
Y = cast(int)y0.floor & 0xFF,
Z = cast(int)z0.floor & 0xFF;
 
// Find relative x,y,z of point in cube.
immutable x = x0 - x0.floor,
y = y0 - y0.floor,
z = z0 - z0.floor;
 
// Compute fade curves for each of x,y,z.
immutable u = fade(x),
v = fade(y),
w = fade(z);
 
// Hash coordinates of the 8 cube corners.
immutable A = p[X ] + Y,
AA = p[A] + Z,
AB = p[A + 1] + Z,
B = p[X + 1] + Y,
BA = p[B] + Z,
BB = p[B + 1] + Z;
 
// And add blended results from 8 corners of cube.
return lerp(w, lerp(v, lerp(u, grad(p[AA ], x , y , z ),
grad(p[BA ], x-1, y , z )),
lerp(u, grad(p[AB ], x , y-1, z ),
grad(p[BB ], x-1, y-1, z ))),
lerp(v, lerp(u, grad(p[AA+1], x , y , z-1),
grad(p[BA+1], x-1, y , z-1)),
lerp(u, grad(p[AB+1], x , y-1, z-1),
grad(p[BB+1], x-1, y-1, z-1))));
}
}
 
void main() {
writefln("%1.17f", PerlinNoise(3.14, 42, 7));
 
/*
// Generate a demo image using the Gray Scale task module.
import grayscale_image;
enum N = 200;
auto im = new Image!Gray(N, N);
foreach (immutable y; 0 .. N)
foreach (immutable x; 0 .. N) {
immutable p = PerlinNoise(x / 30.0, y / 30.0, 0.1);
im[x, y] = Gray(cast(ubyte)(p * 256));
}
im.savePGM("perlin_noise.pgm");
*/
}</lang>
{{out}}
<pre>0.13691995878400012</pre>
 
=={{header|Java}}==
Cookies help us deliver our services. By using our services, you agree to our use of cookies.