1
0
mirror of https://github.com/JustinSDK/dotSCAD.git synced 2025-08-20 05:21:38 +02:00

improved hollow performance

This commit is contained in:
Justin Lin
2017-05-10 22:10:58 +08:00
parent 36a5afbf56
commit 5141099b96

View File

@@ -12,12 +12,13 @@
**/ **/
module polysections(sections, triangles = "SOLID") { module polysections(sections, triangles = "SOLID") {
module solid_sections(sects) { function side_indexes(sects, begin_idx = 0) =
leng_sects = len(sects); let(
leng_pts_sect = len(sects[0]); 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(j = [begin_idx:leng_pts_sect:begin_idx + (leng_sects - 2) * leng_pts_sect])
for(i = [0:leng_pts_sect - 1]) for(i = [0:leng_pts_sect - 1])
[ [
j + i, j + i,
@@ -27,22 +28,74 @@ module polysections(sections, triangles = "SOLID") {
] ]
]; ];
first_idxes = [for(i = [0:leng_pts_sect - 1]) i]; module solid_sections(sects) {
leng_pts_sect = len(sects[0]);
first_idxes = [for(i = [0:leng_pts_sect - 1]) i];
last_idxes = [ last_idxes = [
for(i = [0:leng_pts_sect - 1]) for(i = [0:leng_pts_sect - 1])
i + leng_pts_sect * (leng_sects - 1) i + leng_pts_sect * (len(sects) - 1)
]; ];
v_pts = [ v_pts = [
for(section = sections) for(sect = sects)
for(pt = section) for(pt = sect)
pt pt
]; ];
polyhedron( polyhedron(
v_pts, 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)
); );
} }
@@ -59,29 +112,8 @@ 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) { 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 is for preventing from WARNING: Object may not be a valid 2-manifold
hull() tri_sections( hull() tri_sections(
[ [
@@ -106,10 +138,12 @@ module polysections(sections, triangles = "SOLID") {
} }
} }
//
if(triangles == "SOLID") { if(triangles == "SOLID") {
solid_sections(sections); solid_sections(sections);
} else { } else if(triangles == "HOLLOW") {
hollow_sections(sections);
}
else {
triangles_defined_sections(); triangles_defined_sections();
} }
} }