Perlin noise: Difference between revisions

Content added Content deleted
m (moved ocaml to its alphabetical place in the page)
Line 7: Line 7:
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.
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.
<br><br>
<br><br>

=={{header|OCaml}}==

<lang ocaml>
let 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]

let lerp(t, a, b) = a +. t *. (b -. a)

let fade t =
(t *. t *. t) *. (t *. (t *. 6. -. 15.) +. 10.)

let grad (hash, x, y, z) =
let h = hash land 15 in
let u = if (h < 8) then x else y in
let v = if (h < 4) then y else (if (h = 12 || h = 14) then x else z) in
(if (h land 1 = 0) then u else (0. -. u)) +.
(if (h land 2 = 0) then v else (0. -. v))

let perlin_init p =
List.rev (List.fold_left (fun i x -> x :: i) (List.rev p) p);;

let perlin_noise p x y z =
let x1 = (int_of_float x) land 255 and
y1 = (int_of_float y) land 255 and
z1 = (int_of_float z) land 255 and
xi = x -. (float (int_of_float x)) and
yi = y -. (float (int_of_float y)) and
zi = z -. (float (int_of_float z)) in
let u = fade xi and
v = fade yi and
w = fade zi and
a = (List.nth p x1) + y1 in
let aa = (List.nth p a) + z1 and
ab = (List.nth p (a + 1)) + z1 and
b = (List.nth p (x1 + 1)) + y1 in
let ba = (List.nth p b) + z1 and
bb = (List.nth p (b + 1)) + z1 in
lerp(w, lerp(v, lerp(u, (grad((List.nth p aa), xi, yi, zi)),
(grad((List.nth p ba), xi -. 1., yi , zi))),
lerp(u, (grad((List.nth p ab), xi , yi -. 1., zi)),
(grad((List.nth p bb), xi -. 1., yi -. 1., zi)))),
lerp(v, lerp(u, (grad((List.nth p (aa + 1)), xi, yi, zi -. 1.)),
(grad((List.nth p (ba + 1)), xi -. 1., yi , zi -. 1.))),
lerp(u, (grad((List.nth p (ab + 1)), xi , yi -. 1., zi -. 1.)),
(grad((List.nth p (bb + 1)), xi -. 1., yi -. 1., zi -. 1.)))))

;;

let p = perlin_init permutation in
print_string((Printf.sprintf "%0.17f" (perlin_noise p 3.14 42.0 7.0)) ^ "\n")
</lang>
{{out}}
<pre>0.13691995878400012</pre>


=={{header|C}}==
=={{header|C}}==
Line 774: Line 709:
0.13691995878400012
0.13691995878400012
</pre>
</pre>

=={{header|OCaml}}==

<lang ocaml>let 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]

let lerp (t, a, b) = a +. t *. (b -. a)

let fade t =
(t *. t *. t) *. (t *. (t *. 6. -. 15.) +. 10.)

let grad (hash, x, y, z) =
let h = hash land 15 in
let u = if (h < 8) then x else y in
let v = if (h < 4) then y else (if (h = 12 || h = 14) then x else z) in
(if (h land 1 = 0) then u else (0. -. u)) +.
(if (h land 2 = 0) then v else (0. -. v))

let perlin_init p =
List.rev (List.fold_left (fun i x -> x :: i) (List.rev p) p);;

let perlin_noise p x y z =
let x1 = (int_of_float x) land 255 and
y1 = (int_of_float y) land 255 and
z1 = (int_of_float z) land 255 and
xi = x -. (float (int_of_float x)) and
yi = y -. (float (int_of_float y)) and
zi = z -. (float (int_of_float z)) in
let u = fade xi and
v = fade yi and
w = fade zi and
a = (List.nth p x1) + y1 in
let aa = (List.nth p a) + z1 and
ab = (List.nth p (a + 1)) + z1 and
b = (List.nth p (x1 + 1)) + y1 in
let ba = (List.nth p b) + z1 and
bb = (List.nth p (b + 1)) + z1 in
lerp(w, lerp(v, lerp(u, (grad ((List.nth p aa), xi, yi, zi)),
(grad ((List.nth p ba), xi -. 1., yi , zi))),
lerp(u, (grad ((List.nth p ab), xi , yi -. 1., zi)),
(grad ((List.nth p bb), xi -. 1., yi -. 1., zi)))),
lerp(v, lerp(u, (grad ((List.nth p (aa + 1)), xi, yi, zi -. 1.)),
(grad ((List.nth p (ba + 1)), xi -. 1., yi , zi -. 1.))),
lerp(u, (grad ((List.nth p (ab + 1)), xi , yi -. 1., zi -. 1.)),
(grad ((List.nth p (bb + 1)), xi -. 1., yi -. 1., zi -. 1.)))))

;;

let p = perlin_init permutation in
print_string ((Printf.sprintf "%0.17f" (perlin_noise p 3.14 42.0 7.0)) ^ "\n")</lang>
{{out}}
<pre>0.13691995878400012</pre>


=={{header|Perl}}==
=={{header|Perl}}==