From 8df74588841e63e4cae63ff8f844779013aabcbd Mon Sep 17 00:00:00 2001 From: Filip Sykala Date: Thu, 18 Mar 2021 12:10:09 +0100 Subject: [PATCH] use geometry orientation --- .../SLA/SupportIslands/PointUtils.cpp | 9 -------- .../SLA/SupportIslands/PointUtils.hpp | 3 --- .../SLA/SupportIslands/VoronoiGraphUtils.cpp | 22 ++++++++++++------- src/libslic3r/SLA/SupportPointGenerator.cpp | 2 ++ 4 files changed, 16 insertions(+), 20 deletions(-) diff --git a/src/libslic3r/SLA/SupportIslands/PointUtils.cpp b/src/libslic3r/SLA/SupportIslands/PointUtils.cpp index 3876b1d063..e15524384d 100644 --- a/src/libslic3r/SLA/SupportIslands/PointUtils.cpp +++ b/src/libslic3r/SLA/SupportIslands/PointUtils.cpp @@ -2,12 +2,3 @@ using namespace Slic3r::sla; -bool PointUtils::is_ccw(const Point &p1, const Point &p2, const Point ¢er) -{ - Slic3r::Point v1 = p1 - center; - Slic3r::Point v2 = p2 - center; - - double cross_product = v1.x() * (double) v2.y() - - v2.x() * (double) v1.y(); - return cross_product > 0; -} diff --git a/src/libslic3r/SLA/SupportIslands/PointUtils.hpp b/src/libslic3r/SLA/SupportIslands/PointUtils.hpp index 5e7099cfed..21861f3034 100644 --- a/src/libslic3r/SLA/SupportIslands/PointUtils.hpp +++ b/src/libslic3r/SLA/SupportIslands/PointUtils.hpp @@ -14,9 +14,6 @@ class PointUtils { public: PointUtils() = delete; - - // is point p1 to p2 in counter clock wise order against center? - static bool is_ccw(const Point &p1, const Point &p2, const Point ¢er); }; } // namespace Slic3r::sla diff --git a/src/libslic3r/SLA/SupportIslands/VoronoiGraphUtils.cpp b/src/libslic3r/SLA/SupportIslands/VoronoiGraphUtils.cpp index d29040593f..56aa476d06 100644 --- a/src/libslic3r/SLA/SupportIslands/VoronoiGraphUtils.cpp +++ b/src/libslic3r/SLA/SupportIslands/VoronoiGraphUtils.cpp @@ -214,20 +214,26 @@ Slic3r::Polygon VoronoiGraphUtils::to_polygon(const VD::cell_type & cell, const Slic3r::Points &points, double maximal_distance) { - const VD::edge_type *edge = cell.incident_edge(); Lines lines; Point center = points[cell.source_index()]; // Convenient way to iterate edges around Voronoi cell. + const VD::edge_type *edge = cell.incident_edge(); do { assert(edge->is_linear()); - if (edge->is_primary()) { - std::optional line = to_line(*edge, points, maximal_distance); - if (line.has_value()) { - if (!PointUtils::is_ccw(line->a, line->b, center)) - std::swap(line->a, line->b); - lines.push_back(line.value()); - } + if (!edge->is_primary()) { + edge = edge->next(); + continue; } + std::optional line = to_line(*edge, points, maximal_distance); + if (!line.has_value()) { + edge = edge->next(); + continue; + } + Geometry::Orientation o = Geometry::orient(center, line->a, line->b); + assert(o != Geometry::Orientation::ORIENTATION_COLINEAR); + if (o == Geometry::Orientation::ORIENTATION_CW) + std::swap(line->a, line->b); + lines.push_back(line.value()); edge = edge->next(); } while (edge != cell.incident_edge()); LineUtils::sort_CCW(lines, center); diff --git a/src/libslic3r/SLA/SupportPointGenerator.cpp b/src/libslic3r/SLA/SupportPointGenerator.cpp index e315c9b4e6..389f032e3b 100644 --- a/src/libslic3r/SLA/SupportPointGenerator.cpp +++ b/src/libslic3r/SLA/SupportPointGenerator.cpp @@ -355,6 +355,8 @@ SupportIslandPoints SupportPointGenerator::uniform_cover_island( SupportIslandPoints samples = SampleIslandUtils::sample_voronoi_graph( skeleton, config, longest_path); + SampleIslandUtils::align_samples(samples, island, config); + #ifdef SLA_SUPPORTPOINTGEN_DEBUG const char* support_point_color = "lightgreen"; coord_t support_point_radius = config.head_radius;