From b9590c4a10c5df34f860988ab9847221b106ecc6 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Mon, 27 Jan 2020 09:41:16 +0800 Subject: [PATCH] refactor --- src/_impl/_archimedean_spiral_impl.scad | 28 +++++++++++++++++++++++++ src/archimedean_spiral.scad | 28 ++----------------------- 2 files changed, 30 insertions(+), 26 deletions(-) create mode 100644 src/_impl/_archimedean_spiral_impl.scad diff --git a/src/_impl/_archimedean_spiral_impl.scad b/src/_impl/_archimedean_spiral_impl.scad new file mode 100644 index 00000000..9caa9207 --- /dev/null +++ b/src/_impl/_archimedean_spiral_impl.scad @@ -0,0 +1,28 @@ +function _radian_step(b, theta, l) = + let( + r_square = pow(b * theta, 2), + double_r_square = 2 * r_square + ) + acos((double_r_square - pow(l, 2)) / double_r_square) / 180 * PI; + +function _find_radians(b, point_distance, radians, n, count = 1) = + let(pre_radians = radians[count - 1]) + count == n ? radians : ( + _find_radians( + b, + point_distance, + concat( + radians, + [pre_radians + _radian_step(b, pre_radians, point_distance)] + ), + n, + count + 1) + ); + +function _archimedean_spiral_impl(arm_distance, init_angle, point_distance, num_of_points, rt_dir) = + let(b = arm_distance / (2 * PI), init_radian = init_angle * PI / 180) + [ + for(theta = _find_radians(b, point_distance, [init_radian], num_of_points)) + let(r = b * theta, a = (rt_dir == "CT_CLK" ? 1 : -1) * theta * 57.2958) + [[r * cos(a), r * sin(a)], a] + ]; \ No newline at end of file diff --git a/src/archimedean_spiral.scad b/src/archimedean_spiral.scad index a638bdde..faa565ab 100644 --- a/src/archimedean_spiral.scad +++ b/src/archimedean_spiral.scad @@ -8,31 +8,7 @@ * **/ -function _radian_step(b, theta, l) = - let( - r_square = pow(b * theta, 2), - double_r_square = 2 * r_square - ) - acos((double_r_square - pow(l, 2)) / double_r_square) / 180 * PI; - -function _find_radians(b, point_distance, radians, n, count = 1) = - let(pre_radians = radians[count - 1]) - count == n ? radians : ( - _find_radians( - b, - point_distance, - concat( - radians, - [pre_radians + _radian_step(b, pre_radians, point_distance)] - ), - n, - count + 1) - ); +use <_impl/_archimedean_spiral_impl.scad>; function archimedean_spiral(arm_distance, init_angle, point_distance, num_of_points, rt_dir = "CT_CLK") = - let(b = arm_distance / (2 * PI), init_radian = init_angle * PI / 180) - [ - for(theta = _find_radians(b, point_distance, [init_radian], num_of_points)) - let(r = b * theta, a = (rt_dir == "CT_CLK" ? 1 : -1) * theta * 57.2958) - [[r * cos(a), r * sin(a)], a] - ]; \ No newline at end of file + _archimedean_spiral_impl(arm_distance, init_angle, point_distance, num_of_points, rt_dir); \ No newline at end of file