/ src / _impl / _golden_spiral_impl.scad
_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));