diff --git a/all/dotSCAD.scad b/all/dotSCAD.scad index b8291089..efe889ca 100644 --- a/all/dotSCAD.scad +++ b/all/dotSCAD.scad @@ -70,6 +70,7 @@ include ; include ; include ; include ; +include ; include ; include ; include ; diff --git a/src/util/sort.scad b/src/util/sort.scad new file mode 100644 index 00000000..ce3bbdf4 --- /dev/null +++ b/src/util/sort.scad @@ -0,0 +1,19 @@ +function _sort(pts, i) = + let(leng = len(pts)) + leng <= 1 ? pts : + let( + pivot = pts[0], + before = [for(j = 1; j < leng; j = j + 1) if(pts[j][i] < pivot[i]) pts[j]], + after = [for(j = 1; j < leng; j = j + 1) if(pts[j][i] >= pivot[i]) pts[j]] + ) + concat(_sort(before, i), [pivot], _sort(after, i)); + +function sort(points, by, idx = -1) = + let( + i = by == "x" ? 0 : ( + by == "y" ? 1 : ( + by == "z" ? 2 : idx + ) + ) + ) + _sort(points, i); \ No newline at end of file diff --git a/test/test_all.scad b/test/test_all.scad index 1d11e63d..2d66a739 100644 --- a/test/test_all.scad +++ b/test/test_all.scad @@ -68,6 +68,7 @@ include ; include ; include ; include ; +include ; // Pixel include ; diff --git a/test/util/test_sort.scad b/test/util/test_sort.scad new file mode 100644 index 00000000..354568ce --- /dev/null +++ b/test/util/test_sort.scad @@ -0,0 +1,23 @@ +module test_sort() { + echo("==== test_sort ===="); + + include ; + include ; + + assertEqualPoints( + [[2, 0, 0], [5, 0, 0], [7, 0, 0], [9, 0, 0], [10, 0, 0]], + sort([[10, 0, 0], [5, 0, 0], [7, 0, 0], [2, 0, 0], [9, 0, 0]], by = "x") + ); + + assertEqualPoints( + [[2, 0, 0], [5, 0, 0], [7, 0, 0], [9, 0, 0], [10, 0, 0]], + sort([[10, 0, 0], [5, 0, 0], [7, 0, 0], [2, 0, 0], [9, 0, 0]], by = "idx", idx = 0) + ); + + assertEqualPoints( + [[0, 2, 0], [0, 5, 0], [0, 7, 0], [0, 9, 0], [0, 10, 0]], + sort([[0, 10, 0], [0, 5, 0], [0, 7, 0], [0, 2, 0], [0, 9, 0]], by = "y") + ); +} + +test_sort();