Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/prusa3d/PrusaSlicer.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbubnikv <bubnikv@gmail.com>2017-06-02 14:33:19 +0300
committerbubnikv <bubnikv@gmail.com>2017-06-02 14:33:19 +0300
commitb5f38dd23f413b06e87ebf005a658bf85bb70af6 (patch)
tree0cebb2e1e885defa764742f5666ba29040af8422 /xs/src/libslic3r/MotionPlanner.hpp
parentef73bb404bd4241b9bc576eae7409ebf9013e914 (diff)
Fixed the "avoid crossing perimeters" bug introduced in Slic3r 1.34.1.24version_1.35.1
https://github.com/prusa3d/Slic3r/issues/311 https://github.com/prusa3d/Slic3r/issues/317 https://github.com/prusa3d/Slic3r/issues/323
Diffstat (limited to 'xs/src/libslic3r/MotionPlanner.hpp')
-rw-r--r--xs/src/libslic3r/MotionPlanner.hpp56
1 files changed, 34 insertions, 22 deletions
diff --git a/xs/src/libslic3r/MotionPlanner.hpp b/xs/src/libslic3r/MotionPlanner.hpp
index add1f79cf..e912f2fb4 100644
--- a/xs/src/libslic3r/MotionPlanner.hpp
+++ b/xs/src/libslic3r/MotionPlanner.hpp
@@ -23,34 +23,45 @@ class MotionPlannerEnv
friend class MotionPlanner;
public:
- ExPolygon island;
- BoundingBox island_bbox;
- ExPolygonCollection env;
MotionPlannerEnv() {};
- MotionPlannerEnv(const ExPolygon &island) : island(island), island_bbox(get_extents(island)) {};
+ MotionPlannerEnv(const ExPolygon &island) : m_island(island), m_island_bbox(get_extents(island)) {};
Point nearest_env_point(const Point &from, const Point &to) const;
+ bool island_contains(const Point &pt) const
+ { return m_island_bbox.contains(pt) && m_island.contains(pt); }
+ bool island_contains_b(const Point &pt) const
+ { return m_island_bbox.contains(pt) && m_island.contains_b(pt); }
+
+private:
+ ExPolygon m_island;
+ BoundingBox m_island_bbox;
+ // Region, where the travel is allowed.
+ ExPolygonCollection m_env;
};
+// A 2D directed graph for searching a shortest path using the famous Dijkstra algorithm.
class MotionPlannerGraph
-{
- friend class MotionPlanner;
-
+{
+public:
+ // Add a directed edge into the graph.
+ size_t add_node(const Point &p) { m_nodes.emplace_back(p); return m_nodes.size() - 1; }
+ void add_edge(size_t from, size_t to, double weight);
+ size_t find_closest_node(const Point &point) const { return point.nearest_point_index(m_nodes); }
+
+ bool empty() const { return m_adjacency_list.empty(); }
+ Polyline shortest_path(size_t from, size_t to) const;
+ Polyline shortest_path(const Point &from, const Point &to) const
+ { return this->shortest_path(this->find_closest_node(from), this->find_closest_node(to)); }
+
private:
typedef int node_t;
typedef double weight_t;
struct Neighbor {
+ Neighbor(node_t target, weight_t weight) : target(target), weight(weight) {}
node_t target;
weight_t weight;
- Neighbor(node_t arg_target, weight_t arg_weight) : target(arg_target), weight(arg_weight) {}
};
- typedef std::vector<std::vector<Neighbor>> adjacency_list_t;
- adjacency_list_t adjacency_list;
-
-public:
- Points nodes;
- void add_edge(size_t from, size_t to, double weight);
- size_t find_closest_node(const Point &point) const { return point.nearest_point_index(this->nodes); }
- Polyline shortest_path(size_t from, size_t to) const;
+ Points m_nodes;
+ std::vector<std::vector<Neighbor>> m_adjacency_list;
};
class MotionPlanner
@@ -60,18 +71,19 @@ public:
~MotionPlanner() {}
Polyline shortest_path(const Point &from, const Point &to);
- size_t islands_count() const { return this->islands.size(); }
+ size_t islands_count() const { return m_islands.size(); }
private:
- bool initialized;
- std::vector<MotionPlannerEnv> islands;
- MotionPlannerEnv outer;
- std::vector<std::unique_ptr<MotionPlannerGraph>> graphs;
+ bool m_initialized;
+ std::vector<MotionPlannerEnv> m_islands;
+ MotionPlannerEnv m_outer;
+ // 0th graph is the graph for m_outer. Other graphs are 1 indexed.
+ std::vector<std::unique_ptr<MotionPlannerGraph>> m_graphs;
void initialize();
const MotionPlannerGraph& init_graph(int island_idx);
const MotionPlannerEnv& get_env(int island_idx) const
- { return (island_idx == -1) ? this->outer : this->islands[island_idx]; }
+ { return (island_idx == -1) ? m_outer : m_islands[island_idx]; }
};
}