From 6affac09a721d098bdd9f3b564f97b25926590c8 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Tue, 31 May 2022 15:50:25 +0800 Subject: [PATCH] add tri_subdivide --- src/experimental/tri_subdivide.scad | 39 +++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 src/experimental/tri_subdivide.scad diff --git a/src/experimental/tri_subdivide.scad b/src/experimental/tri_subdivide.scad new file mode 100644 index 00000000..83da68ab --- /dev/null +++ b/src/experimental/tri_subdivide.scad @@ -0,0 +1,39 @@ +function _tri_subdivide_pts(points, n) = + let( + p0 = points[0], + basis = [points[2] - p0, points[1] - p0] / n, + pts = [ + for(ri = [0:n], ci = [0:n - ri]) + p0 + [ri, ci] * basis + ] + ) + pts; + +function _tri_subdivide_indices(n) = + let( + ri_base = [for(ri = 0, row_2 = n + 2; ri <= n; ri = ri + 1) ri * row_2 - ri * (ri + 1) * 0.5] + ) + [ + for(ri = [0:n - 1]) + let(cols = n - ri - 1, base_i = ri_base[ri], base_i1 = ri_base[ri + 1]) + for(ci = [0:cols]) + let(ci_base_i = ci + base_i, ci_base_i1 = ci + base_i1, ci_base_i_1 = ci_base_i + 1) + if(ci != cols) + each [ + [ci_base_i_1, ci_base_i1, ci_base_i], + [ci_base_i1 + 1, ci_base_i1, ci_base_i_1] + ] + else + [ci_base_i_1, ci_base_i1, ci_base_i] + ]; + +function tri_subdivide(tri, n) = + let( + pts = _tri_subdivide_pts(tri, n), + indices = _tri_subdivide_indices(n) + ) + [ + for(ti = indices) + [pts[ti[0]], pts[ti[1]], pts[ti[2]]] + ]; + \ No newline at end of file