Connect points by triangulation to create filled surface by triangles Input points have to be unique Inspiration for make unique points is Emboss::dilate_to_unique_points.
87{
88 assert(!points.empty());
89 assert(!constrained_half_edges.empty());
90
91 assert(std::is_sorted(constrained_half_edges.begin(),
92 constrained_half_edges.end()));
93
94 assert(std::adjacent_find(constrained_half_edges.begin(), constrained_half_edges.end()) == constrained_half_edges.end());
95
97
100
101 using K = CGAL::Exact_predicates_inexact_constructions_kernel;
102 using Vb = CGAL::Triangulation_vertex_base_with_info_2<uint32_t, K>;
103 using Fb = CGAL::Constrained_triangulation_face_base_2<K>;
104 using Tds = CGAL::Triangulation_data_structure_2<Vb, Fb>;
105 using CDT = CGAL::Constrained_Delaunay_triangulation_2<K, Tds, CGAL::Exact_predicates_tag>;
106
107
109 {
110 std::vector<CDT::Vertex_handle> vertices_handle(points.size());
111 using Point_with_ord = std::pair<CDT::Point, size_t>;
112 using SearchTrait = CGAL::Spatial_sort_traits_adapter_2
113 <
K, CGAL::First_of_pair_property_map<Point_with_ord> >;
114
115 std::vector<Point_with_ord> cdt_points;
116 cdt_points.reserve(points.size());
117 size_t ord = 0;
118 for (const auto &p : points)
119 cdt_points.emplace_back(
std::make_pair(CDT::
Point{p.
x(), p.
y()}, ord++));
120
121 SearchTrait st;
122 CGAL::spatial_sort(cdt_points.begin(), cdt_points.end(), st);
124 for (const auto& p : cdt_points) {
125 auto handle =
cdt.insert(p.first,
f);
126 handle->info() = p.second;
127 vertices_handle[p.second] = handle;
129 }
130
131
132 for (
const HalfEdge &edge : constrained_half_edges)
133 cdt.insert_constraint(vertices_handle[edge.first], vertices_handle[edge.second]);
134 }
135
136 auto faces =
cdt.finite_face_handles();
137
138
139 size_t num_faces = 0;
140 for (CDT::Face_handle fh : faces) {
141 for (int i = 0; i < 3; ++i) {
142 if (!fh->is_constrained(i)) continue;
143 auto key = std::make_pair(fh->vertex((i + 2) % 3)->info(), fh->vertex((i + 1) % 3)->info());
144 auto it = std::lower_bound(constrained_half_edges.begin(), constrained_half_edges.end(), key);
145 if (it == constrained_half_edges.end() || *it != key) continue;
146
147 for (int j = 0; j < 3; ++ j)
148 fh->set_constraint(j, false);
149 --num_faces;
150 break;
151 }
152 ++num_faces;
153 }
154
155 auto inside = [](CDT::Face_handle &fh) {
156 return fh->neighbor(0) != fh &&
157 (fh->is_constrained(0) ||
158 fh->is_constrained(1) ||
159 fh->is_constrained(2));
160 };
161
162#ifdef VISUALIZE_TRIANGULATION
163 std::vector<Vec3i> indices2;
164 indices2.reserve(num_faces);
165 for (CDT::Face_handle fh : faces)
167 visualize(points, indices2, "C:/data/temp/triangulation_without_floodfill.obj");
168#endif
169
170
171 std::vector<CDT::Face_handle> queue;
172 queue.reserve(num_faces);
173 for (CDT::Face_handle seed : faces){
174 if (!
inside(seed))
continue;
175
176 queue.emplace_back(seed);
177 while (! queue.empty()) {
178 CDT::Face_handle fh = queue.back();
179 queue.pop_back();
180 for (int i = 0; i < 3; ++i) {
181 if (fh->is_constrained(i)) continue;
182
183 fh->set_constraint(i, true);
184 CDT::Face_handle nh = fh->neighbor(i);
185 bool was_inside =
inside(nh);
186
187 nh->set_constraint(nh->index(fh), true);
188 if (! was_inside)
189 queue.push_back(nh);
190 }
191 }
192 }
193
194 std::vector<Vec3i> indices;
195 indices.reserve(num_faces);
196 for (CDT::Face_handle fh : faces)
198 indices.emplace_back(fh->
vertex(0)->info(), fh->
vertex(1)->info(), fh->
vertex(2)->info());
199
200#ifdef VISUALIZE_TRIANGULATION
201 visualize(points, indices, "C:/data/temp/triangulation.obj");
202#endif
203
204 return indices;
205}
std::pair< uint32_t, uint32_t > HalfEdge
Definition Triangulation.hpp:18
if(!(yy_init))
Definition lexer.c:1190
const Scalar & y
Definition MathFunctions.h:552
bool inside(const Polygons &polygons, const Point &p)
CGAL::Simple_cartesian< double > K
Definition VoronoiUtilsCgal.cpp:19
static double f(double x, double z_sin, double z_cos, bool vertical, bool flip)
Definition FillGyroid.cpp:12
IGL_INLINE bool cdt(const Eigen::PlainObjectBase< DerivedV > &V, const Eigen::PlainObjectBase< DerivedF > &F, const CDTParam ¶m, Eigen::PlainObjectBase< DerivedTV > &TV, Eigen::PlainObjectBase< DerivedTT > &TT, Eigen::PlainObjectBase< DerivedTF > &TF)
Definition cdt.cpp:18
TCoord< P > x(const P &p)
Definition geometry_traits.hpp:297
TPoint< S > & vertex(S &sh, unsigned long idx, const PolygonTag &)
Definition geometry_traits.hpp:1180
bool has_bidirectional_constrained(const Triangulation::HalfEdges &constrained)
Definition Triangulation.cpp:37
bool has_self_intersection(const Points &points, const Triangulation::HalfEdges &constrained_half_edges)
Definition Triangulation.cpp:56
bool is_unique(const Points &points)
Definition Triangulation.cpp:49
CGAL::Triangulation_vertex_base_with_info_2< unsigned int, Kernel > Vb
Definition point_areas.cpp:17
CGAL::Triangulation_data_structure_2< Vb > Tds
Definition point_areas.cpp:18