_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 ];