From 2a504293d78896fc2f6f200dde1e6be5c84a7807 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Sun, 14 May 2017 10:53:36 +0800 Subject: [PATCH] refactored --- src/__private__/__pie_for_rounding.scad | 18 ++++++++++++ src/rounded_cylinder.scad | 37 +++++++++---------------- 2 files changed, 31 insertions(+), 24 deletions(-) create mode 100644 src/__private__/__pie_for_rounding.scad diff --git a/src/__private__/__pie_for_rounding.scad b/src/__private__/__pie_for_rounding.scad new file mode 100644 index 00000000..0026fb8d --- /dev/null +++ b/src/__private__/__pie_for_rounding.scad @@ -0,0 +1,18 @@ +function __pie_for_rounding(r, begin_a, end_a, frags) = + let( + sector_angle = end_a - begin_a, + step_a = sector_angle / frags, + is_integer = frags % 1 == 0 + ) + concat([ + for(ang = [begin_a:step_a:end_a]) + [ + r * cos(ang), + r * sin(ang) + ] + ], + is_integer ? [] : [[ + r * cos(end_a), + r * sin(end_a) + ]] + ); \ No newline at end of file diff --git a/src/rounded_cylinder.scad b/src/rounded_cylinder.scad index 57471700..931839d9 100644 --- a/src/rounded_cylinder.scad +++ b/src/rounded_cylinder.scad @@ -12,13 +12,12 @@ include <__private__/__is_vector.scad>; include <__private__/__frags.scad>; +include <__private__/__pie_for_rounding.scad>; module rounded_cylinder(radius, h, round_r, convexity = 2, center = false) { is_vt = __is_vector(radius); r1 = is_vt ? radius[0] : radius; r2 = is_vt ? radius[1] : radius; - - function is_integer(n) = n % 1 == 0; function round_frags(sector_angle) = __frags(round_r) * sector_angle / 360; @@ -35,32 +34,22 @@ module rounded_cylinder(radius, h, round_r, convexity = 2, center = false) { t_leng = r2 - round_r * tan(t_sector_angle / 2); t_round_frags = round_frags(t_sector_angle); + b_corner = [ + for(pt = __pie_for_rounding(round_r, -90, b_end_angle, b_round_frags)) + [pt[0] + b_leng, pt[1] + round_r] + ]; + + t_corner = [ + for(pt = __pie_for_rounding(round_r, 90 - t_sector_angle, 90, t_round_frags)) + [pt[0] + t_leng, pt[1] + h - round_r] + ]; + translate(center ? [0, 0, -h/2] : [0, 0, 0]) rotate(180) rotate_extrude(convexity = convexity) polygon( concat( [[0, 0], [b_leng, 0]], - [ - for(ang = [-90:step_a(b_sector_angle, b_round_frags):b_end_angle]) - [ - round_r * cos(ang) + b_leng, - round_r * sin(ang) + round_r - ] - ], - is_integer(b_round_frags) ? [] : [[ - round_r * cos(b_end_angle) + b_leng, - round_r * sin(b_end_angle) + round_r - ]], - [ - for(ang = [90 - t_sector_angle:step_a(t_sector_angle, t_round_frags):90]) - [ - round_r * cos(ang) + t_leng, - round_r * sin(ang) + h - round_r - ] - ], - is_integer(t_round_frags) ? [] : [[ - t_leng, - round_r + h - round_r - ]], + b_corner, + t_corner, [[t_leng, h], [0, h]] ) );