From 2448fe26d9523b5d9dca9b7818bd726f8d4901b5 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Wed, 26 Feb 2020 13:43:39 +0800 Subject: [PATCH] should sort by xy --- src/experimental/_impl/_convex_hull_impl.scad | 13 +++++++++++++ src/experimental/convex_hull.scad | 3 +-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/experimental/_impl/_convex_hull_impl.scad b/src/experimental/_impl/_convex_hull_impl.scad index 5d95d9b0..691fd5b7 100644 --- a/src/experimental/_impl/_convex_hull_impl.scad +++ b/src/experimental/_impl/_convex_hull_impl.scad @@ -1,5 +1,18 @@ use ; +function _convex_hull_lt_than_by_xy(p1, p2) = + p1[0] < p2[0] || (p1[0] == p2[0] && p1[1] < p2[1]); + +function _convex_hull_sort_by_xy(lt) = + let(leng = len(lt)) + leng <= 1 ? lt : + let( + pivot = lt[0], + before = [for(j = 1; j < leng; j = j + 1) if(_convex_hull_lt_than_by_xy(lt[j], pivot)) lt[j]], + after = [for(j = 1; j < leng; j = j + 1) if(!_convex_hull_lt_than_by_xy(lt[j], pivot)) lt[j]] + ) + concat(_convex_hull_sort_by_xy(before), [pivot], _convex_hull_sort_by_xy(after)); + // oa->ob ct_clk : greater than 0 function _convex_hull_impl_dir(o, a, b) = let( diff --git a/src/experimental/convex_hull.scad b/src/experimental/convex_hull.scad index dda0bc55..23d83d74 100644 --- a/src/experimental/convex_hull.scad +++ b/src/experimental/convex_hull.scad @@ -1,9 +1,8 @@ use ; -use ; function convex_hull(points) = let( - sorted = sort(points, by = "x"), + sorted = _convex_hull_sort_by_xy(points), leng = len(sorted), lwr_ch = _convex_hull_lower_chain(sorted, leng, [], 0, 0), leng_lwr_ch = len(lwr_ch),