1
0
mirror of https://github.com/JustinSDK/dotSCAD.git synced 2025-01-17 14:18:13 +01:00
dotSCAD/examples/voronoi/ruyi_pineapple.scad
2022-06-06 13:11:46 +08:00

123 lines
3.2 KiB
OpenSCAD

use <fibonacci_lattice.scad>
use <shape_superformula.scad>
use <ring_extrude.scad>
use <polyhedron_hull.scad>
use <curve.scad>
use <polyline_join.scad>
use <voronoi/vrn_sphere.scad>
use <util/rand.scad>
model = "BOTH"; // ["PINAPPLE", "RUYI", "BOTH"]
eye_number = 150;
leaf_number = 7;
leaf_step = 0.5;
leaf_fn = 36;
ruyi_step = 0.1;
ruyi_fn = 12;
if(model == "PINAPPLE") {
pineapple(eye_number, leaf_step, leaf_number, leaf_fn);
}
else if(model == "RUYI") {
ruyi(ruyi_step, ruyi_fn);
}
else {
translate([-90, 0, -76])
rotate([90, 0, 0])
ruyi(ruyi_step, ruyi_fn);
rotate([0, -15, 0])
pineapple(eye_number, leaf_step, leaf_number, leaf_fn);
}
module ruyi(ruyi_step, ruyi_fn) {
pts = [
[17, 20],
[17, 15],
[-10, 8],
[-5, 0],
[14, 20],
[3, 24],
[-5, 10],
[10, 0],
[21, 7],
[14, 10],
[12, 5],
[30, 0],
[55, 5],
[80, 0],
[85, 15]
];
points = curve(ruyi_step, pts, 0);
scale([2.4, 3.5, 3.5])
linear_extrude(12.5, center = true)
polyline_join(points)
circle(1, $fn = ruyi_fn);
}
module pineapple(eye_number, leaf_step, leaf_number, leaf_fn) {
real_eye_number = eye_number + rand(0, 10);
pts = fibonacci_lattice(real_eye_number, 1);
regions = vrn_sphere(pts);
scale(50) {
mirror([0, 0, 1])
scale([1, 1, 1.3])
union() {
for(i = [0:real_eye_number - 1]) {
polyhedron_hull(concat(regions[i], [pts[i] * rand(1.05, 1.075)]));
}
sphere(1.0015, $fn = 96);
}
// leaves
shape = [
for(p = shape_superformula(leaf_step, 3, 3, 4.5, 10, 10))
p.x > 0 ?
[p.x * abs(p.y / 1.75) / 10, p.y / 10] :
[p.x * 0.03, p.y / 10]
];
color("Olive")
translate([0, 0, 1.2])
scale([1.75, 1.75, 1]) {
$fn = leaf_fn;
a_step = 360 / leaf_number;
scale([1.2, 1.1, 4])
translate([-.475, 0, 0])
rotate([90, 0, 0])
ring_extrude(shape, radius = .5, angle = 60, scale = .025, twist = rand(5, 45));
rand_angles = rands(0, 90, 3);
range = [0:leaf_number - 1];
for(i = range) {
rotate(i * a_step + rand_angles[0])
scale([1, 1, 3])
translate([-.6, 0, 0])
rotate([90, 0, 0])
ring_extrude(shape, radius = .5, angle = rand(60, 65), scale = .025, twist = rand(5, 45));
}
for(i = range) {
rotate(i * a_step + rand_angles[1])
scale([1, 1, 2])
translate([-.65, 0, 0])
rotate([90, 0, 0])
ring_extrude(shape, radius = .5, angle = rand(80, 85), scale = .025, twist = rand(5, 45));
}
for(i = range) {
rotate(i * a_step + rand_angles[2])
translate([-.675, 0, 0])
rotate([90, 0, 0])
ring_extrude(shape, radius = .5, angle = rand(90, 95), scale = .025, twist = rand(5, 45));
}
}
}
}