_golden_spiral_impl.scad
1 use <../__comm__/__fast_fibonacci.scad> 2 use <../shape_circle.scad> 3 4 function _remove_same_pts(pts1, pts2) = 5 concat( 6 pts1, 7 pts1[len(pts1) - 1] == pts2[0] ? [for(i = [1:len(pts2) - 1]) pts2[i]] : pts2 8 ); 9 10 function _rz_matrix(a) = 11 let(c = cos(a), s = sin(a)) 12 [ 13 [c, -s], 14 [s, c], 15 ]; 16 17 function _from_ls_or_eql_to(from, to, point_distance, rt_dir) = 18 let( 19 f1 = __fast_fibonacci(from), 20 fn = floor(f1 * PI * 2 / point_distance), 21 $fn = fn + 4 - (fn % 4), 22 circle_pts = shape_circle(radius = f1, n = $fn / 4 + 1), 23 len_pts_1 = len(circle_pts) - 1, 24 a_step = 360 / $fn * rt_dir, 25 range_i = [0:len_pts_1], 26 as = [each range_i] * a_step, 27 c_idx = rt_dir == 1 ? function(i) i : function(i) len_pts_1 - i, 28 29 d_f1f2 = f1 - __fast_fibonacci(from + 1), 30 off_p = rt_dir == 1 ? [0, d_f1f2, 0] : [d_f1f2, 0, 0], 31 za = 90 * rt_dir, 32 m = _rz_matrix(za) 33 ) _remove_same_pts( 34 [for(i = range_i) [circle_pts[c_idx(i)], as[i]]], 35 [ 36 for(pt_a = _golden_spiral(from + 1, to, point_distance, rt_dir)) 37 [ 38 m * pt_a[0] + off_p, 39 pt_a[1] + za 40 ] 41 ] 42 ); 43 44 function _golden_spiral(from, to, point_distance, rt_dir) = 45 from > to ? [] : _from_ls_or_eql_to(from, to, point_distance, rt_dir); 46 47 function _golden_spiral_impl(from, to, point_distance, rt_dir) = 48 _golden_spiral(from, to, point_distance, (rt_dir == "CT_CLK" ? 1 : -1));