diff --git a/examples/fourier_vase.scad b/examples/fourier_vase.scad new file mode 100644 index 00000000..151d95b2 --- /dev/null +++ b/examples/fourier_vase.scad @@ -0,0 +1,77 @@ +use +use +use +use + +radius = 10; +thickness = .5; +model_scale = 5; + +stop = 50; +sample_rate = 250; +number_of_waves = 1; // n harmonically related number_of_waves + +freq = .1; +amplitude = 2; +harmonic_fn = function(x, n) amplitude * sin(degrees((2 * n + 1) * freq * 2 * PI * x)) / (2 * n + 1); + +main_curve = reverse( + bezier_curve( + 1 / sample_rate, + [[0, 0], [15, 8], [10, 15], [-5, 20], [5, stop]] + ) +); + +for(i = [1:3]) { + $fn = 2 * i + 2; + translate([i * radius * 25, 0]) + scale(model_scale) + fourier_vase( + radius, + thickness, + stop, + sample_rate, + number_of_waves * i, + harmonic_fn, + main_curve + ); +} + +module fourier_vase(radius, thickness, stop, sample_rate, number_of_waves, harmonic_fn, main_curve) { + function x(y, n = 0) = + n == number_of_waves ? 0 : harmonic_fn(y, n) + x(y, n + 1); + + wave_pts = [ + for(y = [0:stop / sample_rate:stop]) + [x(y), y] + ]; + + pts = [ + [0, 0], + each is_undef(main_curve) ? [ + for(i = [0:len(wave_pts) - 1]) + [radius + wave_pts[i].x, wave_pts[i].y] + ] : [ + for(i = [0:len(wave_pts) - 1]) + [radius + wave_pts[i].x + main_curve[i].x, wave_pts[i].y]], + [0, stop] + ]; + + translate([0, 0, stop]) + mirror([0, 0, 1]) + difference() { + rotate_extrude() + polygon(pts); + + rotate_extrude() + offset(-thickness) + polygon(pts); + + translate([0, 0, -1]) + linear_extrude(thickness + 1.001) + circle(radius * 2); + + linear_extrude(stop - thickness) + circle(thickness * 2); + } +} \ No newline at end of file