diff --git a/xs/src/TriangleMesh.cpp b/xs/src/TriangleMesh.cpp index dcdf7580..58a4a588 100644 --- a/xs/src/TriangleMesh.cpp +++ b/xs/src/TriangleMesh.cpp @@ -270,13 +270,6 @@ TriangleMesh::slice(const std::vector &z, std::vector* layers) printf("z: min = %.2f, max = %.2f\n", min_z, max_z); #endif - if (min_z == max_z) { - #ifdef SLIC3R_DEBUG - printf("Facet is horizontal; ignoring\n"); - #endif - continue; - } - // find layer extents std::vector::const_iterator min_layer, max_layer; min_layer = std::lower_bound(z.begin(), z.end(), min_z); // first layer whose slice_z is >= min_z @@ -319,7 +312,9 @@ TriangleMesh::slice(const std::vector &z, std::vector* layers) stl_vertex* v1 = &v_scaled_shared[ this->stl.v_indices[facet_idx].vertex[1] ]; stl_vertex* v2 = &v_scaled_shared[ this->stl.v_indices[facet_idx].vertex[2] ]; IntersectionLine line; - if (v0->z < slice_z || v1->z < slice_z || v2->z < slice_z) { + if (min_z == max_z) { + line.edge_type = feHorizontal; + } else if (v0->z < slice_z || v1->z < slice_z || v2->z < slice_z) { line.edge_type = feTop; std::swap(a, b); std::swap(a_id, b_id); @@ -335,7 +330,10 @@ TriangleMesh::slice(const std::vector &z, std::vector* layers) lines[layer_idx].push_back(line); found_horizontal_edge = true; - break; + + // if this is a top or bottom edge, we can stop looping through edges + // because we won't find anything interesting + if (line.edge_type != feHorizontal) break; } else if (a->z == slice_z) { IntersectionPoint point; point.x = a->x; @@ -398,6 +396,13 @@ TriangleMesh::slice(const std::vector &z, std::vector* layers) printf("Layer %d:\n", layer_idx); #endif + /* + SVG svg("lines.svg"); + for (IntersectionLines::iterator line = it->begin(); line != it->end(); ++line) + svg.AddLine(*line); + svg.Close(); + */ + // remove tangent edges for (IntersectionLines::iterator line = it->begin(); line != it->end(); ++line) { if (line->skip || line->edge_type == feNone) continue; @@ -421,6 +426,13 @@ TriangleMesh::slice(const std::vector &z, std::vector* layers) line->skip = true; break; } + } else if (line->a_id == line2->b_id && line->b_id == line2->a_id) { + /* if this edge joins two horizontal facets, remove both of them */ + if (line->edge_type == feHorizontal && line2->edge_type == feHorizontal) { + line->skip = true; + line2->skip = true; + break; + } } } } diff --git a/xs/src/TriangleMesh.hpp b/xs/src/TriangleMesh.hpp index f20340b4..7efb0945 100644 --- a/xs/src/TriangleMesh.hpp +++ b/xs/src/TriangleMesh.hpp @@ -49,7 +49,7 @@ class TriangleMesh void require_shared_vertices(); }; -enum FacetEdgeType { feNone, feTop, feBottom }; +enum FacetEdgeType { feNone, feTop, feBottom, feHorizontal }; class IntersectionPoint : public Point {