From 5141099b964acfcadece8466828c763aaee369f0 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Wed, 10 May 2017 22:10:58 +0800 Subject: [PATCH] improved hollow performance --- src/polysections.scad | 116 +++++++++++++++++++++++++++--------------- 1 file changed, 75 insertions(+), 41 deletions(-) diff --git a/src/polysections.scad b/src/polysections.scad index 34ace6e2..c3d9834e 100644 --- a/src/polysections.scad +++ b/src/polysections.scad @@ -12,39 +12,92 @@ **/ module polysections(sections, triangles = "SOLID") { + function side_indexes(sects, begin_idx = 0) = + let( + leng_sects = len(sects), + leng_pts_sect = len(sects[0]) + ) + [ + for(j = [begin_idx:leng_pts_sect:begin_idx + (leng_sects - 2) * leng_pts_sect]) + for(i = [0:leng_pts_sect - 1]) + [ + j + i, + j + (i + 1) % leng_pts_sect, + j + (i + 1) % leng_pts_sect + leng_pts_sect , + j + i + leng_pts_sect + ] + ]; + module solid_sections(sects) { - leng_sects = len(sects); leng_pts_sect = len(sects[0]); - - side_idxes = [ - for(j = [0:leng_pts_sect:(leng_sects - 2) * leng_pts_sect]) - for(i = [0:leng_pts_sect - 1]) - [ - j + i, - j + (i + 1) % leng_pts_sect, - j + (i + 1) % leng_pts_sect + leng_pts_sect , - j + i + leng_pts_sect - ] - ]; first_idxes = [for(i = [0:leng_pts_sect - 1]) i]; - last_idxes = [ for(i = [0:leng_pts_sect - 1]) - i + leng_pts_sect * (leng_sects - 1) + i + leng_pts_sect * (len(sects) - 1) ]; v_pts = [ - for(section = sections) - for(pt = section) + for(sect = sects) + for(pt = sect) pt ]; polyhedron( v_pts, - concat([first_idxes], side_idxes, [last_idxes]) + concat([first_idxes], side_indexes(sects), [last_idxes]) ); } + + module hollow_sections(sects) { + leng_sects = len(sects); + leng_sect = len(sects[0]); + half_leng_sect = leng_sect / 2; + half_leng_v_pts = leng_sects * half_leng_sect; + + function strip_sects(begin_idx, end_idx) = + [ + for(i = [0:leng_sects - 1]) + [ + for(j = [begin_idx:end_idx]) + sects[i][j] + ] + ]; + + function end_idxes(begin_idx) = + [ + for(i = [0:half_leng_sect - 1]) + [ + begin_idx + i, + begin_idx + (i + 1) % half_leng_sect, + begin_idx + (i + 1) % half_leng_sect + half_leng_v_pts, + begin_idx + i + half_leng_v_pts + ] + ]; + + outer_sects = strip_sects(0, half_leng_sect - 1); + inner_sects = strip_sects(half_leng_sect, leng_sect - 1); + + function to_v_pts(sects) = + [ + for(sect = sects) + for(pt = sect) + pt + ]; + + outer_v_pts = to_v_pts(outer_sects); + inner_v_pts = to_v_pts(inner_sects); + + outer_idxes = side_indexes(outer_sects); + inner_idxes = side_indexes(inner_sects, half_leng_v_pts); + first_idxes = end_idxes(0); + last_idxes = end_idxes(half_leng_v_pts - half_leng_sect); + + polyhedron( + concat(outer_v_pts, inner_v_pts), + concat(first_idxes, outer_idxes, inner_idxes, last_idxes) + ); + } module triangles_defined_sections() { module tri_sections(tri1, tri2) { @@ -58,30 +111,9 @@ module polysections(sections, triangles = "SOLID") { ] ); } - - function hollow_tris() = - let( - leng_section = len(sections[0]), - inner_i_begin = leng_section / 2, - idxes = concat( - [ - for(i = [0:inner_i_begin - 1]) - let(n = inner_i_begin + i + 1) - [i, inner_i_begin + i, n % inner_i_begin + inner_i_begin] - ], - [ - for(i = [0:inner_i_begin - 1]) - let(n = inner_i_begin + i + 1) - [i, i + 1, n % leng_section] - ] - ) - ) idxes; - - function tris() = - triangles == "HOLLOW" ? hollow_tris() : triangles; module two_sections(section1, section2) { - for(idx = tris()) { + for(idx = triangles) { // hull is for preventing from WARNING: Object may not be a valid 2-manifold hull() tri_sections( [ @@ -106,10 +138,12 @@ module polysections(sections, triangles = "SOLID") { } } - // if(triangles == "SOLID") { solid_sections(sections); - } else { + } else if(triangles == "HOLLOW") { + hollow_sections(sections); + } + else { triangles_defined_sections(); } } \ No newline at end of file