/ src / _impl / _archimedean_spiral_impl.scad
_archimedean_spiral_impl.scad
 1  use <../util/radians.scad>
 2  use <../util/degrees.scad>
 3  
 4  function _radian_step(r, pow2_dist) =
 5      radians(acos(1 - pow2_dist / (2 * r ^ 2)));
 6  
 7  function _find_radians(b, pow2_dist, init_radian, n) = 
 8      [
 9          for(
10              count = 0, radian = init_radian; 
11              count < n; 
12              count = count + 1, radian = radian + _radian_step(b * radian, pow2_dist)
13          )
14          radian
15      ];
16  
17  function _archimedean_spiral_impl(arm_distance, init_angle, point_distance, num_of_points, rt_dir) =
18      let(b = arm_distance / (2 * PI), init_radian = radians(init_angle), sgn = rt_dir == "CT_CLK" ? 1 : -1)
19      [
20          for(radian = _find_radians(b, point_distance ^ 2, init_radian, num_of_points)) 
21          let(r = b * radian, a = degrees(sgn * radian))
22          [r * [cos(a), sin(a)], a]
23      ];