Perlin noise: Difference between revisions

m
→‎{{header|Phix}}: syntax coloured
(Added FORTRAN 90 implementation)
m (→‎{{header|Phix}}: syntax coloured)
Line 1,389:
 
=={{header|Phix}}==
<!--<lang Phix>(phixonline)-->
<lang Phix>constant ph = x"97 A0 89 5B 5A 0F 83 0D C9 5F 60 35 C2 E9 07 E1"&
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
x"8C 24 67 1E 45 8E 08 63 25 F0 15 0A 17 BE 06 94"&
<span style="color: #008080;">constant</span> <span style="color: #000000;">ph</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">x"97 A0 89 5B 5A 0F 83 0D C9 5F 60 35 C2 E9 07 E1"</span><span style="color: #0000FF;">&</span>
x"F7 78 EA 4B 00 1A C5 3E 5E FC DB CB 75 23 0B 20"&
<span style="color: #008000;">x"398C B124 2167 581E ED45 958E 3808 5763 AE25 14F0 7D15 880A AB17 A8BE 4406 94"</span><span style="color: AF#0000FF;">&</span>
<span style="color: #008000;">x"4AF7 A578 47EA 864B 8B00 301A 1BC5 A63E 4D5E 92FC 9EDB E7CB 5375 6F23 E50B 20"</span><span style="color: 7A#0000FF;">&</span>
<span style="color: #008000;">x"3C39 D3B1 8521 E658 DCED 6995 5C38 2957 37AE 2E14 F57D 2888 F4AB 66A8 8F44 AF"</span><span style="color: 36#0000FF;">&</span>
<span style="color: #008000;">x"414A 19A5 3F47 A186 018B D830 501B 49A6 D14D 4C92 849E BBE7 D053 596F 12E5 7A"</span><span style="color: A9#0000FF;">&</span>
<span style="color: #008000;">x"C83C C4D3 8785 82E6 74DC BC69 9F5C 5629 A437 642E 6DF5 C628 ADF4 BA66 038F 36"</span><span style="color: 40#0000FF;">&</span>
<span style="color: #008000;">x"3441 D919 E23F FAA1 7C01 7BD8 0550 CA49 26D1 934C 7684 7EBB FFD0 5259 5512 A9"</span><span style="color: D4#0000FF;">&</span>
<span style="color: #008000;">x"CFC8 CEC4 3B87 E382 2F74 10BC 3A9F 1156 B6A4 BD64 1C6D 2AC6 DFAD B7BA AA03 40"</span><span style="color: D5#0000FF;">&</span>
<span style="color: #008000;">x"7734 F8D9 98E2 02FA 2C7C 9A7B A305 46CA DD26 9993 6576 9B7E A7FF 2B52 AC55 D4"</span><span style="color: 09#0000FF;">&</span>
<span style="color: #008000;">x"81CF 16CE 273B FDE3 132F 6210 6C3A 6E11 4FB6 71BD E01C E82A B2DF B9B7 70AA D5"</span><span style="color: 68#0000FF;">&</span>
<span style="color: #008000;">x"DA77 F6F8 6198 E402 FB2C 229A F2A3 C146 EEDD D299 9065 0C9B BFA7 B32B A2AC 09"</span><span style="color: F1#0000FF;">&</span>
<span style="color: #008000;">x"5181 3316 9127 EBFD F913 0E62 EF6C 6B6E 314F C071 D6E0 1FE8 B5B2 C7B9 6A70 68"</span><span style="color: 9D#0000FF;">&</span>
<span style="color: #008000;">x"B8DA 54F6 CC61 B0E4 73FB 7922 32F2 2DC1 7FEE 04D2 9690 FE0C 8ABF ECB3 CDA2 F1"</span><span style="color: 5D#0000FF;">&</span>
<span style="color: #008000;">x"DE51 7233 4391 1DEB 18F9 480E F3EF 8D6B 8031 C3C0 4ED6 421F D7B5 3DC7 9C6A 9D"</span><span style="color: B4#0000FF;",>&</span>
<span style="color: #008000;">x"B8 54 CC B0 73 79 32 2D 7F 04 96 FE 8A EC CD 5D"</span><span style="color: #0000FF;">&</span>
p = ph&ph
<span style="color: #008000;">x"DE 72 43 1D 18 48 F3 8D 80 C3 4E 42 D7 3D 9C B4"</span><span style="color: #0000FF;">,</span>
<span style="color: #000000;">p</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">ph</span><span style="color: #0000FF;">&</span><span style="color: #000000;">ph</span>
function fade(atom t) return t * t * t * (t * (t * 6 - 15) + 10) end function
function lerp(atom t, a, b) return a + t * (b - a) end function
<span style="color: #008080;">function</span> <span style="color: #000000;">fade</span><span style="color: #0000FF;">(</span><span style="color: #004080;">atom</span> <span style="color: #000000;">t</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">return</span> <span style="color: #000000;">t</span> <span style="color: #0000FF;">*</span> <span style="color: #000000;">t</span> <span style="color: #0000FF;">*</span> <span style="color: #000000;">t</span> <span style="color: #0000FF;">*</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">t</span> <span style="color: #0000FF;">*</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">t</span> <span style="color: #0000FF;">*</span> <span style="color: #000000;">6</span> <span style="color: #0000FF;">-</span> <span style="color: #000000;">15</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;">+</span> <span style="color: #000000;">10</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
function grad(int hash, atom x, y, z)
<span style="color: #008080;">function</span> <span style="color: #000000;">lerp</span><span style="color: #0000FF;">(</span><span style="color: #004080;">atom</span> <span style="color: #000000;">t</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">a</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">b</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">return</span> <span style="color: #000000;">a</span> <span style="color: #0000FF;">+</span> <span style="color: #000000;">t</span> <span style="color: #0000FF;">*</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">b</span> <span style="color: #0000FF;">-</span> <span style="color: #000000;">a</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
int h = and_bits(hash,15)
<span style="color: #008080;">function</span> <span style="color: #000000;">grad</span><span style="color: #0000FF;">(</span><span style="color: #004080;">int</span> <span style="color: #000000;">hash</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">atom</span> <span style="color: #000000;">x</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">y</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">z</span><span style="color: #0000FF;">)</span>
atom u = iff(h<8 ? x : y),
<span style="color: #004080;">int</span> <span style="color: #000000;">h</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">and_bits</span><span style="color: #0000FF;">(</span><span style="color: #000000;">hash</span><span style="color: #0000FF;">,</span><span style="color: #000000;">15</span><span style="color: #0000FF;">)</span>
v = iff(h<4 ? y : iff(h==12 or h==14 ? x : z))
<span style="color: #004080;">atom</span> <span style="color: #000000;">u</span> <span style="color: #0000FF;">=</span> <span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #000000;">h</span><span style="color: #0000FF;"><</span><span style="color: #000000;">8</span> <span style="color: #0000FF;">?</span> <span style="color: #000000;">x</span> <span style="color: #0000FF;">:</span> <span style="color: #000000;">y</span><span style="color: #0000FF;">),</span>
return iff(and_bits(h,1) == 0 ? u : -u) +
<span style="color: #000000;">v</span> <span style="color: #0000FF;">=</span> <span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #000000;">h</span><span style="color: #0000FF;"><</span><span style="color: #000000;">4</span> <span style="color: #0000FF;">?</span> <span style="color: #000000;">y</span> <span style="color: #0000FF;">:</span> <span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #000000;">h</span><span style="color: #0000FF;">==</span><span style="color: #000000;">12</span> <span style="color: #008080;">or</span> <span style="color: #000000;">h</span><span style="color: #0000FF;">==</span><span style="color: #000000;">14</span> <span style="color: #0000FF;">?</span> <span style="color: #000000;">x</span> <span style="color: #0000FF;">:</span> <span style="color: #000000;">z</span><span style="color: #0000FF;">))</span>
iff(and_bits(h,2) == 0 ? v : -v)
<span style="color: #008080;">return</span> <span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">and_bits</span><span style="color: #0000FF;">(</span><span style="color: #000000;">h</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;">==</span> <span style="color: #000000;">0</span> <span style="color: #0000FF;">?</span> <span style="color: #000000;">u</span> <span style="color: #0000FF;">:</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">u</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;">+</span>
end function
<span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">and_bits</span><span style="color: #0000FF;">(</span><span style="color: #000000;">h</span><span style="color: #0000FF;">,</span><span style="color: #000000;">2</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;">==</span> <span style="color: #000000;">0</span> <span style="color: #0000FF;">?</span> <span style="color: #000000;">v</span> <span style="color: #0000FF;">:</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">v</span><span style="color: #0000FF;">)</span>
 
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
function noise(atom x, y, z)
integer X = and_bits(x,255),
<span style="color: #008080;">function</span> <span style="color: #000000;">noise</span><span style="color: #0000FF;">(</span><span style="color: #004080;">atom</span> <span style="color: #000000;">x</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">y</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">z</span><span style="color: #0000FF;">)</span>
Y = and_bits(y,255),
<span style="color: #004080;">integer</span> <span style="color: #000000;">X</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">and_bits</span><span style="color: #0000FF;">(</span><span style="color: #000000;">x</span><span style="color: #0000FF;">,</span><span style="color: #000000;">255</span><span style="color: #0000FF;">),</span>
Z = and_bits(z,255)
<span style="color: #000000;">Y</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">and_bits</span><span style="color: #0000FF;">(</span><span style="color: #000000;">y</span><span style="color: #0000FF;">,</span><span style="color: #000000;">255</span><span style="color: #0000FF;">),</span>
x -= floor(x)
<span style="color: #000000;">Z</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">and_bits</span><span style="color: #0000FF;">(</span><span style="color: #000000;">z</span><span style="color: #0000FF;">,</span><span style="color: #000000;">255</span><span style="color: #0000FF;">)</span>
y -= floor(y)
<span style="color: #000000;">x</span> <span style="color: #0000FF;">-=</span> <span style="color: #7060A8;">floor</span><span style="color: #0000FF;">(</span><span style="color: #000000;">x</span><span style="color: #0000FF;">)</span>
z -= floor(z)
<span style="color: #000000;">y</span> <span style="color: #0000FF;">-=</span> <span style="color: #7060A8;">floor</span><span style="color: #0000FF;">(</span><span style="color: #000000;">y</span><span style="color: #0000FF;">)</span>
atom u = fade(x),
<span style="color: #000000;">z</span> <span style="color: #0000FF;">-=</span> <span style="color: #7060A8;">floor</span><span style="color: #0000FF;">(</span><span style="color: #000000;">z</span><span style="color: #0000FF;">)</span>
v = fade(y),
<span style="color: #004080;">atom</span> <span style="color: #000000;">u</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">fade</span><span style="color: #0000FF;">(</span><span style="color: #000000;">x</span><span style="color: #0000FF;">),</span>
w = fade(z)
<span style="color: #000000;">v</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">fade</span><span style="color: #0000FF;">(</span><span style="color: #000000;">y</span><span style="color: #0000FF;">),</span>
integer A = p[X+1]+Y, AA = p[A+1]+Z, AB = p[A+2]+Z,
<span style="color: #000000;">w</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">fade</span><span style="color: #0000FF;">(</span><span style="color: #000000;">z</span><span style="color: #0000FF;">)</span>
B = p[X+2]+Y, BA = p[B+1]+Z, BB = p[B+2]+Z
<span style="color: #004080;">integer</span> <span style="color: #000000;">A</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">p</span><span style="color: #0000FF;">[</span><span style="color: #000000;">X</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]+</span><span style="color: #000000;">Y</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">AA</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">p</span><span style="color: #0000FF;">[</span><span style="color: #000000;">A</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]+</span><span style="color: #000000;">Z</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">AB</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">p</span><span style="color: #0000FF;">[</span><span style="color: #000000;">A</span><span style="color: #0000FF;">+</span><span style="color: #000000;">2</span><span style="color: #0000FF;">]+</span><span style="color: #000000;">Z</span><span style="color: #0000FF;">,</span>
 
<span style="color: #000000;">B</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">p</span><span style="color: #0000FF;">[</span><span style="color: #000000;">X</span><span style="color: #0000FF;">+</span><span style="color: #000000;">2</span><span style="color: #0000FF;">]+</span><span style="color: #000000;">Y</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">BA</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">p</span><span style="color: #0000FF;">[</span><span style="color: #000000;">B</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]+</span><span style="color: #000000;">Z</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">BB</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">p</span><span style="color: #0000FF;">[</span><span style="color: #000000;">B</span><span style="color: #0000FF;">+</span><span style="color: #000000;">2</span><span style="color: #0000FF;">]+</span><span style="color: #000000;">Z</span>
return lerp(w,lerp(v,lerp(u,grad(p[AA+1], x , y , z ),
grad(p[BA+1], x-1, y , z )),
<span style="color: #008080;">return</span> <span style="color: #000000;">lerp</span><span style="color: #0000FF;">(</span><span style="color: #000000;">w</span><span style="color: #0000FF;">,</span><span style="color: #000000;">lerp</span><span style="color: #0000FF;">(</span><span style="color: #000000;">v</span><span style="color: #0000FF;">,</span><span style="color: #000000;">lerp</span><span style="color: #0000FF;">(</span><span style="color: #000000;">u</span><span style="color: #0000FF;">,</span><span style="color: #000000;">grad</span><span style="color: #0000FF;">(</span><span style="color: #000000;">p</span><span style="color: #0000FF;">[</span><span style="color: #000000;">AA</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">],</span> <span style="color: #000000;">x</span> <span style="color: #0000FF;">,</span> <span style="color: #000000;">y</span> <span style="color: #0000FF;">,</span> <span style="color: #000000;">z</span> <span style="color: #0000FF;">),</span>
lerp(u,grad(p[AB+1], x , y-1, z ),
<span style="color: #000000;">grad</span><span style="color: #0000FF;">(</span><span style="color: #000000;">p</span><span style="color: #0000FF;">[</span><span style="color: #000000;">BA</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">],</span> <span style="color: #000000;">x</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">y</span> <span style="color: #0000FF;">,</span> <span style="color: #000000;">z</span> <span style="color: #0000FF;">)),</span>
grad(p[BB+1], x-1, y-1, z ))),
<span style="color: #000000;">lerp</span><span style="color: #0000FF;">(</span><span style="color: #000000;">u</span><span style="color: #0000FF;">,</span><span style="color: #000000;">grad</span><span style="color: #0000FF;">(</span><span style="color: #000000;">p</span><span style="color: #0000FF;">[</span><span style="color: #000000;">AB</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">],</span> <span style="color: #000000;">x</span> <span style="color: #0000FF;">,</span> <span style="color: #000000;">y</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">z</span> <span style="color: #0000FF;">),</span>
lerp(v,lerp(u,grad(p[AA+2], x , y , z-1 ),
<span style="color: #000000;">grad</span><span style="color: #0000FF;">(</span><span style="color: #000000;">p</span><span style="color: #0000FF;">[</span><span style="color: #000000;">BB</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">],</span> <span style="color: #000000;">x</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">y</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">z</span> <span style="color: #0000FF;">))),</span>
grad(p[BA+2], x-1, y , z-1 )),
<span style="color: #000000;">lerp</span><span style="color: #0000FF;">(</span><span style="color: #000000;">v</span><span style="color: #0000FF;">,</span><span style="color: #000000;">lerp</span><span style="color: #0000FF;">(</span><span style="color: #000000;">u</span><span style="color: #0000FF;">,</span><span style="color: #000000;">grad</span><span style="color: #0000FF;">(</span><span style="color: #000000;">p</span><span style="color: #0000FF;">[</span><span style="color: #000000;">AA</span><span style="color: #0000FF;">+</span><span style="color: #000000;">2</span><span style="color: #0000FF;">],</span> <span style="color: #000000;">x</span> <span style="color: #0000FF;">,</span> <span style="color: #000000;">y</span> <span style="color: #0000FF;">,</span> <span style="color: #000000;">z</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span> <span style="color: #0000FF;">),</span>
lerp(u,grad(p[AB+2], x , y-1, z-1 ),
<span style="color: #000000;">grad</span><span style="color: #0000FF;">(</span><span style="color: #000000;">p</span><span style="color: #0000FF;">[</span><span style="color: #000000;">BA</span><span style="color: #0000FF;">+</span><span style="color: #000000;">2</span><span style="color: #0000FF;">],</span> <span style="color: #000000;">x</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">y</span> <span style="color: #0000FF;">,</span> <span style="color: #000000;">z</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span> <span style="color: #0000FF;">)),</span>
grad(p[BB+2], x-1, y-1, z-1 ))))
<span style="color: #000000;">lerp</span><span style="color: #0000FF;">(</span><span style="color: #000000;">u</span><span style="color: #0000FF;">,</span><span style="color: #000000;">grad</span><span style="color: #0000FF;">(</span><span style="color: #000000;">p</span><span style="color: #0000FF;">[</span><span style="color: #000000;">AB</span><span style="color: #0000FF;">+</span><span style="color: #000000;">2</span><span style="color: #0000FF;">],</span> <span style="color: #000000;">x</span> <span style="color: #0000FF;">,</span> <span style="color: #000000;">y</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">z</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span> <span style="color: #0000FF;">),</span>
end function
<span style="color: #000000;">grad</span><span style="color: #0000FF;">(</span><span style="color: #000000;">p</span><span style="color: #0000FF;">[</span><span style="color: #000000;">BB</span><span style="color: #0000FF;">+</span><span style="color: #000000;">2</span><span style="color: #0000FF;">],</span> <span style="color: #000000;">x</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">y</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">z</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span> <span style="color: #0000FF;">))))</span>
 
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
printf(1,"Perlin Noise for (3.14,42,7) is %.17f\n",{noise(3.14,42,7)})</lang>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Perlin Noise for (3.14,42,7) is %.17f\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">noise</span><span style="color: #0000FF;">(</span><span style="color: #000000;">3.14</span><span style="color: #0000FF;">,</span><span style="color: #000000;">42</span><span style="color: #0000FF;">,</span><span style="color: #000000;">7</span><span style="color: #0000FF;">)})</span>
<!--</lang>-->
{{out}}
<pre>
7,806

edits