3 # This file is part of NIT ( http://www.nitlanguage.org ).
4 # This program is public domain
8 # See: <http://rosettacode.org/wiki/Perlin_noise>
13 fun fade
: Float do return self*self*self*(self*(self*6.0-15.0)+10.0)
19 var p
: Array[Int] = [151,160,137,91,90,15,
20 131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23,
21 190, 6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33,
22 88,237,149,56,87,174,20,125,136,171,168, 68,175,74,165,71,134,139,48,27,166,
23 77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244,
24 102,143,54, 65,25,63,161, 1,216,80,73,209,76,132,187,208, 89,18,169,200,196,
25 135,130,116,188,159,86,164,100,109,198,173,186, 3,64,52,217,226,250,124,123,
26 5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42,
27 223,183,170,213,119,248,152, 2,44,154,163, 70,221,153,101,155,167, 43,172,9,
28 129,22,39,253, 19,98,108,110,79,113,224,232,178,185, 112,104,218,246,97,228,
29 251,34,242,193,238,210,144,12,191,179,162,241, 81,51,145,235,249,14,239,107,
30 49,192,214, 31,181,199,106,157,184, 84,204,176,115,121,50,45,127, 4,150,254,
31 138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180]
33 # Noise value in [-1..1] at 3d coordinates `x, y, z`
34 fun noise
(x
, y
, z
: Float): Float
36 var xx
= x
.to_i
.bin_and
(255)
37 var yy
= y
.to_i
.bin_and
(255)
38 var zz
= z
.to_i
.bin_and
(255)
55 return w
.lerp
(v
.lerp
(u
.lerp
(grad
(p
[aa
], x
, y
, z
),
56 grad
(p
[ba
], x-1
.0
, y
, z
)),
57 u
.lerp
(grad
(p
[ab
], x
, y-1
.0
, z
),
58 grad
(p
[bb
], x-1
.0
, y-1
.0
, z
))),
59 v
.lerp
(u
.lerp
(grad
(p
[aa
+1], x
, y
, z-1
.0
),
60 grad
(p
[ba
+1], x-1
.0
, y
, z-1
.0
)),
61 u
.lerp
(grad
(p
[ab
+1], x
, y-1
.0
, z-1
.0
),
62 grad
(p
[bb
+1], x-1
.0
, y-1
.0
, z-1
.0
))))
65 # Value at a corner of the grid
66 fun grad
(hash
: Int, x
, y
, z
: Float): Float
68 var h
= hash
.bin_and
(15)
69 var u
= if h
< 8 then x
else y
70 var v
= if h
< 4 then y
else if h
== 12 or h
== 14 then x
else z
71 return (if h
.is_even
then u
else -u
) + (if h
.bin_and
(2) == 0 then v
else -v
)
75 var map
= new ImprovedNoise
76 print map
.noise
(3.14, 42.0, 7.0).to_precision
(17)