1
0
mirror of https://github.com/JustinSDK/dotSCAD.git synced 2025-01-17 22:28:16 +01:00
dotSCAD/examples/distorted_vase.scad

83 lines
1.8 KiB
OpenSCAD
Raw Normal View History

2021-05-08 11:34:54 +08:00
use <shape_circle.scad>;
use <bezier_curve.scad>;
use <sweep.scad>;
use <path_scaling_sections.scad>;
use <bijection_offset.scad>;
use <util/rand.scad>;
use <noise/nz_perlin2s.scad>;
use <noise/nz_perlin3s.scad>;
2021-05-08 12:00:29 +08:00
beginning_radius = 15;
2021-05-08 11:34:54 +08:00
thickness = 2;
fn = 180;
2021-05-08 12:00:29 +08:00
amplitude = 10;
curve_step = 0.02;
2021-05-08 11:34:54 +08:00
smoothness = 15;
// Perlin noise 2D or 3D
perlin = 2; // [2, 3]
2021-05-08 12:00:29 +08:00
bottom = "NO"; // ["YES", "NO"]
2021-05-08 11:34:54 +08:00
epsilon = 0.000001;
2021-05-08 12:00:29 +08:00
distorted_vase(beginning_radius, thickness, fn, amplitude, curve_step, smoothness, perlin, epsilon);
2021-05-08 11:34:54 +08:00
2021-05-08 12:00:29 +08:00
module distorted_vase(beginning_radius, thickness, fn, amplitude,curve_step, smoothness, perlin, epsilon) {
2021-05-08 11:34:54 +08:00
seed = rand() * 1000;
section = shape_circle(radius = beginning_radius, $fn = fn);
pt = [beginning_radius, 0, 0];
2021-05-08 12:00:29 +08:00
edge_path = bezier_curve(curve_step, [
2021-05-08 11:34:54 +08:00
pt,
pt + [15, 0, 20],
pt + [45, 0, 50],
pt + [20, 0, 70],
pt + [5, 0, 80],
pt + [-5, 0, 100],
pt + [10, 0, 140]
]);
sections = path_scaling_sections(section, edge_path);
noise = perlin == 2 ? function(pts, seed) nz_perlin2s(pts, seed) :
function(pts, seed) nz_perlin3s(pts, seed);
noisy = [
for(section = sections)
let(nz = noise(section / smoothness, seed))
[
for(i = [0:len(nz) - 1])
let(
p = section[i],
p2d = [p[0], p[1]],
noisyP = p2d + p2d / norm(p2d) * nz[i] * amplitude
)
[noisyP[0], noisyP[1], p[2]]
]
];
offset_noisy = [
for(section = noisy)
let(
offset_s = bijection_offset(section, thickness, epsilon)
)
[
for(i = [0:len(offset_s) - 1])
[offset_s[i][0], offset_s[i][1], section[i][2]]
]
];
all = [
for(i = [0:len(offset_noisy) - 1])
concat(
offset_noisy[i],
noisy[i]
)
];
sweep(all, triangles = "HOLLOW");
2021-05-08 12:00:29 +08:00
if(bottom == "YES") {
linear_extrude(thickness)
polygon([for(p = offset_noisy[len(offset_noisy) - 1]) [p[0], p[1]]]);
}
2021-05-08 11:34:54 +08:00
}