# PerlinNoiseGen

Jul 25th, 2021 (edited)
1,127
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
1. \$fn=3;
2.
3. randomize = true;
4. setseed = 123456;
5. seed = randomize ? floor(rands(0, 1000000, 1)[0]) : setseed;
6. echo(Seed = seed);
7.
8. {
9.   // Functions
10.
11.   {
12.     // Main noise generator
13.     //
14.     // b = base random array, don't set this
15.     // a = recursion array, don't set this!
16.     // no = number of octaves, you can set this, number of elements is no^2
17.     // o = current octave iteration, don't set this
18.     // seed = rands seed, you can set this
19.     //
20.     // Returns: Perlin noise array, length(no ^ 2)
21.     function noise(b=[], a=[], no=4, o=0, seed=0) =
22.       (o > no)
23.       ? scalevec(2, a) // Done, return the array
24.       : (len(b) == 0)
25.         ? noise(rands(0, 1, no ^ 2, seed), a=[], no=no, o=o, seed=seed)
26.         : (len(a) == 0)
27.           ? noise(b=b, a=octave(o=0, b=b), no=no, o=o + 1, seed=seed)
28.           : noise(b=b, a=addvec(a, octave(o=o, b=b)), no=no, o=o + 1, seed=seed);
29.   }
30.   // ^ Main noise generator
31.
32.   {
33.     // Octave generator
34.     //
35.     // o = octave
36.     // b = base random array
37.     //
38.     // Returns: array of values from a single noise octave
39.     function octave(o=0, b=[]) =
40.       expand(c=len(b), a=[
41.         for(i=[0 : len(b) / (2 ^ o) : len(b) - 1]) b[i]
42.       ]);
43.   }
44.   // ^ Octave generator
45.
46.   {
47.     // Expand octave
48.     //
49.     // c = base array length
50.     // a = octave array
51.     //
52.     // Returns: array of length=length(base) with interpolated octave values
53.     function expand(c=0, a=[]) = [
54.       for(i=[0 : c - 1])
55.         (len(a) == 1)
56.         ? a[0]
57.         : (len(a) == c)
58.           ? a[i] * (c / len(a) / c)
59.           : (interp(v=[
60.                         a[floor(i / (c / len(a)))],
61.                         (floor(i / (c / len(a))) + 1 == len(a))
62.                           ? a[0]
63.                           : a[floor(i / (c / len(a))) + 1]],
64.                     s=c / len(a))
65.                     * (i % (c / len(a)))
66.                     + a[floor(i / (c / len(a)))])
67.                   * ((c / len(a)) / c)
68.       ];
69.   }
70.   // ^ Expand octave
71.
72.   {
73.     // Helper functions
74.     function interp(v=[], s=0) = (v[1] - v[0]) / s;
75.
76.     function addvec(a=[], b=[]) = [
77.       for(i=[0 : len(a) - 1])
78.         a[i] + b[i]
79.       ];
80.
81.     function scalevec(d=2, v=[]) = [
82.     for(i=[0 : len(v) - 1])
83.       v[i] / d
84.     ];
85.
86.   }
87.   // ^ Helper functions
88. }
89. // ^ Functions
90.
91. // Example:
92. //
93. // no = 8 means we will get a noise array with 8 ^ 2 = 64 values (range 0-1)
94. // seed = seed, this is set up with the variables above, you could set it manually. Defaults to 0 if not set
95. a = noise(no=8, seed=seed);
96.
97. // This displays the values.
98. repeat = 1;
99. for(i=[0 : len(a) - 1], x=[0 : repeat]) {
100.   translate([i + len(a) * x, 0, 0]) cylinder(a[i] * 100, d=1);
101. }
RAW Paste Data