Skip to content

Commit 68e6aa7

Browse files
committed
Simplification: add simple workaround to mergeWithNext
For when the two consecutive halfedges to merge have different direction (left--right or right--left). See CGAL/cgal#8659 for context.
1 parent 86131ff commit 68e6aa7

File tree

1 file changed

+21
-2
lines changed

1 file changed

+21
-2
lines changed

cartocrow/simplification/util.hpp

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,27 @@ inline TArr::Halfedge_handle mergeWithPrev(TArr& dcel, typename TArr::Halfedge_h
4242

4343
template <class TArr>
4444
inline TArr::Halfedge_handle mergeWithNext(TArr& dcel, typename TArr::Halfedge_handle edge) {
45-
return dcel.merge_edge(edge, edge->next(),
46-
Segment<Exact>(edge->source()->point(), edge->next()->target()->point()));
45+
Segment<Exact> curve(edge->source()->point(), edge->next()->target()->point());
46+
if (edge->direction() == edge->next()->direction()) {
47+
return dcel.merge_edge(edge, edge->next(), curve);
48+
} else {
49+
auto fd1 = edge->face()->data();
50+
auto fd2 = edge->twin()->face()->data();
51+
dcel.remove_edge(edge->next());
52+
dcel.remove_edge(edge);
53+
auto he = CGAL::insert_non_intersecting_curve(dcel, curve);
54+
55+
typename TArr::Traits_2 traits;
56+
auto equal = traits.equal_2_object();
57+
if (equal(curve.source(), he->source()->point())) {
58+
he->face()->data() = fd1;
59+
he->twin()->face()->data() = fd2;
60+
} else {
61+
he->face()->data() = fd2;
62+
he->twin()->face()->data() = fd1;
63+
}
64+
return he;
65+
}
4766
}
4867

4968
template <class TArr>

0 commit comments

Comments
 (0)