Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- $fn=3;
- randomize = true;
- setseed = 123456;
- seed = randomize ? floor(rands(0, 1000000, 1)[0]) : setseed;
- echo(Seed = seed);
- {
- // Functions
- {
- // Main noise generator
- //
- // b = base random array, don't set this
- // a = recursion array, don't set this!
- // no = number of octaves, you can set this, number of elements is no^2
- // o = current octave iteration, don't set this
- // seed = rands seed, you can set this
- //
- // Returns: Perlin noise array, length(no ^ 2)
- function noise(b=[], a=[], no=4, o=0, seed=0) =
- (o > no)
- ? scalevec(2, a) // Done, return the array
- : (len(b) == 0)
- ? noise(rands(0, 1, no ^ 2, seed), a=[], no=no, o=o, seed=seed)
- : (len(a) == 0)
- ? noise(b=b, a=octave(o=0, b=b), no=no, o=o + 1, seed=seed)
- : noise(b=b, a=addvec(a, octave(o=o, b=b)), no=no, o=o + 1, seed=seed);
- }
- // ^ Main noise generator
- {
- // Octave generator
- //
- // o = octave
- // b = base random array
- //
- // Returns: array of values from a single noise octave
- function octave(o=0, b=[]) =
- expand(c=len(b), a=[
- for(i=[0 : len(b) / (2 ^ o) : len(b) - 1]) b[i]
- ]);
- }
- // ^ Octave generator
- {
- // Expand octave
- //
- // c = base array length
- // a = octave array
- //
- // Returns: array of length=length(base) with interpolated octave values
- function expand(c=0, a=[]) = [
- for(i=[0 : c - 1])
- (len(a) == 1)
- ? a[0]
- : (len(a) == c)
- ? a[i] * (c / len(a) / c)
- : (interp(v=[
- a[floor(i / (c / len(a)))],
- (floor(i / (c / len(a))) + 1 == len(a))
- ? a[0]
- : a[floor(i / (c / len(a))) + 1]],
- s=c / len(a))
- * (i % (c / len(a)))
- + a[floor(i / (c / len(a)))])
- * ((c / len(a)) / c)
- ];
- }
- // ^ Expand octave
- {
- // Helper functions
- function interp(v=[], s=0) = (v[1] - v[0]) / s;
- function addvec(a=[], b=[]) = [
- for(i=[0 : len(a) - 1])
- a[i] + b[i]
- ];
- function scalevec(d=2, v=[]) = [
- for(i=[0 : len(v) - 1])
- v[i] / d
- ];
- }
- // ^ Helper functions
- }
- // ^ Functions
- // Example:
- //
- // no = 8 means we will get a noise array with 8 ^ 2 = 64 values (range 0-1)
- // seed = seed, this is set up with the variables above, you could set it manually. Defaults to 0 if not set
- a = noise(no=8, seed=seed);
- // This displays the values.
- repeat = 1;
- for(i=[0 : len(a) - 1], x=[0 : repeat]) {
- translate([i + len(a) * x, 0, 0]) cylinder(a[i] * 100, d=1);
- }
Add Comment
Please, Sign In to add comment