From 5ebf3e18e4a87a820428653c80e05d64da98815a Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Sun, 14 May 2017 12:50:52 +0800 Subject: [PATCH] refactored --- src/__private__/__half_trapezium.scad | 31 +++++++++++++++++ src/rounded_cylinder.scad | 48 ++++++++------------------- 2 files changed, 44 insertions(+), 35 deletions(-) create mode 100644 src/__private__/__half_trapezium.scad diff --git a/src/__private__/__half_trapezium.scad b/src/__private__/__half_trapezium.scad new file mode 100644 index 00000000..28c352c0 --- /dev/null +++ b/src/__private__/__half_trapezium.scad @@ -0,0 +1,31 @@ +function __half_trapezium(radius, h, round_r) = + let( + is_vt = __is_vector(radius), + r1 = is_vt ? radius[0] : radiusm, + r2 = is_vt ? radius[1] : radius, + frags = __frags(round_r), + b_ang = atan2(h, r1 - r2), + b_sector_angle = 180 - b_ang, + b_leng = r1 - round_r / tan(b_ang / 2), + b_round_frags = frags * b_sector_angle / 360, + b_end_angle = -90 + b_sector_angle, + t_sector_angle = b_ang, + t_leng = r2 - round_r * tan(t_sector_angle / 2), + t_round_frags = frags * t_sector_angle / 360, + + half_h = h / 2, + + br_corner = [ + for(pt = __pie_for_rounding(round_r, -90, b_end_angle, b_round_frags)) + [pt[0] + b_leng, pt[1] + round_r - half_h] + ], + + tr_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 - half_h] + ] + ) + concat( + br_corner, + tr_corner + ); \ No newline at end of file diff --git a/src/rounded_cylinder.scad b/src/rounded_cylinder.scad index 6f5567cf..fc74f7d6 100644 --- a/src/rounded_cylinder.scad +++ b/src/rounded_cylinder.scad @@ -13,41 +13,19 @@ include <__private__/__is_vector.scad>; include <__private__/__frags.scad>; include <__private__/__pie_for_rounding.scad>; +include <__private__/__half_trapezium.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; +module rounded_cylinder(radius, h, round_r, convexity = 2, center = false) { + r_corners = __half_trapezium(radius, h, round_r); - function round_frags(sector_angle) = __frags(round_r) * sector_angle / 360; - - b_ang = atan2(h, r1 - r2); - b_sector_angle = 180 - b_ang; - b_leng = r1 - round_r / tan(b_ang / 2); - b_round_frags = round_frags(b_sector_angle); - b_end_angle = -90 + b_sector_angle; - - t_sector_angle = b_ang; - 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]], - b_corner, - t_corner, - [[t_leng, h], [0, h]] - ) - ); + translate(center ? [0, 0, 0] : [0, 0, h/2]) + rotate(180) + rotate_extrude(convexity = convexity) + polygon( + concat( + [[0, -h/2]], + r_corners, + [[0, h/2]] + ) + ); } \ No newline at end of file