From b6d86ab4ba2ae598d588935e3918afabd93ca9ae Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Thu, 26 Aug 2021 21:09:32 +0800 Subject: [PATCH] angle_between adds a ccw param --- src/_impl/_angle_between_impl.scad | 12 ++++++++++++ src/angle_between.scad | 7 ++++++- src/experimental/note.md | 2 ++ 3 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 src/_impl/_angle_between_impl.scad diff --git a/src/_impl/_angle_between_impl.scad b/src/_impl/_angle_between_impl.scad new file mode 100644 index 00000000..aa053dd3 --- /dev/null +++ b/src/_impl/_angle_between_impl.scad @@ -0,0 +1,12 @@ +function angle_between_ccw_2d(v1, v2) = + let(a = atan2(v1[0] * v2[1] - v1[1] * v2[0], v1 * v2)) + a >= 0 ? a : a + 360; + +function angle_between_ccw_3d(v1, v2) = + let( + dot = v1 * v2, + lenSq1 = v1[0] ^ 2 + v1[1] ^ 2 + v1[2] ^ 2, + lenSq2 = v2[0] ^ 2 + v2[1] ^ 2 + v2[2] ^ 2, + a = acos(dot / sqrt(lenSq1 * lenSq2)) + ) + a >= 0 ? a : a + 360; \ No newline at end of file diff --git a/src/angle_between.scad b/src/angle_between.scad index 011d996c..11ea2579 100644 --- a/src/angle_between.scad +++ b/src/angle_between.scad @@ -8,4 +8,9 @@ * **/ -function angle_between(vt1, vt2) = acos((vt1 * vt2) / (norm(vt1) * norm(vt2))); \ No newline at end of file +use <_impl/_angle_between_impl.scad>; + +function angle_between(vt1, vt2, ccw = false) = + !ccw ? acos((vt1 * vt2) / (norm(vt1) * norm(vt2))) : + len(vt1) == 2 ? angle_between_ccw_2d(vt1, vt2) : + angle_between_ccw_3d(vt1, vt2); \ No newline at end of file diff --git a/src/experimental/note.md b/src/experimental/note.md index f3003ca9..d65faf02 100644 --- a/src/experimental/note.md +++ b/src/experimental/note.md @@ -3,4 +3,6 @@ to_do: - deprecate paths2sections(paths) -> rails2sections(rails) - deprecate path_scaling_sections(shape_pts, edge_path) -> rail_extruded_sections(shape_pts, rail) +- angle_between adds a ccw param. + - doc: sf add convexity \ No newline at end of file