11 #ifndef UTILS_EDGE_COLLAPSOR_H_
12 #define UTILS_EDGE_COLLAPSOR_H_
15 #include "utils/Edge_contractor.h"
16 #include "utils/UI_utils.h"
23 SkBlComplex& complex_;
24 unsigned num_collapses_;
27 typedef typename SkBlComplex::Vertex_handle Vertex_handle;
28 typedef typename SkBlComplex::Edge_handle Edge_handle;
36 complex_(complex), num_collapses_(num_collapses) {
37 std::list<Edge_handle> edges;
38 edges.insert(edges.begin(), complex_.edge_range().begin(), complex_.edge_range().end());
41 [&](Edge_handle e1, Edge_handle e2) {
42 return squared_edge_length(e1) < squared_edge_length(e2);
45 collapse_edges(edges);
49 void collapse_edges(std::list<Edge_handle>& edges) {
50 while (!edges.empty() && num_collapses_--) {
51 Edge_handle current_edge = edges.front();
53 if (is_link_reducible(current_edge))
54 complex_.remove_edge(current_edge);
58 bool is_link_reducible(Edge_handle e) {
59 auto link = complex_.link(e);
67 if (link.num_connected_components() > 1)
72 return (link.num_vertices() == 1);
75 double squared_edge_length(Edge_handle e)
const {
76 return squared_eucl_distance(complex_.point(complex_.first_vertex(e)), complex_.point(complex_.second_vertex(e)));
79 double squared_eucl_distance(
const Point& p1,
const Point& p2)
const {
80 return Geometry_trait::Squared_distance_d()(p1, p2);
Definition: Edge_collapsor.h:21
Edge_collapsor(SkBlComplex &complex, unsigned num_collapses)
Collapse num_collapses edges. If num_collapses<0 then it collapses all possible edges....
Definition: Edge_collapsor.h:35
Definition: Edge_contractor.h:24