59 lines
1.3 KiB
C++
59 lines
1.3 KiB
C++
#include "hole_filling.h"
|
|
#include "util.h"
|
|
#include <MeshReconstruction.h>
|
|
|
|
|
|
static std::vector<std::vector<HalfedgeHandle>> findHoles(MyMesh &mesh) {
|
|
std::vector<std::vector<HalfedgeHandle>> holes;
|
|
std::set<HalfedgeHandle> ignore;
|
|
for (HalfedgeHandle it : mesh.halfedges()) {
|
|
if (mesh.is_boundary(it)
|
|
&& ignore.find(it) == ignore.end()) {
|
|
holes.emplace_back();
|
|
holes.back().push_back(it);
|
|
ignore.insert(it);
|
|
for (HalfedgeHandle it2 : HalfedgeLoopRange<MyMesh>(mesh, it)) {
|
|
holes.back().push_back(it2);
|
|
ignore.insert(it2);
|
|
}
|
|
}
|
|
}
|
|
return holes;
|
|
}
|
|
|
|
|
|
void fillHoleDumb(MyMesh &mesh, std::vector<HalfedgeHandle> &hole) {
|
|
mesh.request_vertex_status();
|
|
mesh.request_edge_status();
|
|
mesh.request_face_status();
|
|
|
|
Point center(0, 0, 0);
|
|
size_t length = 0;
|
|
for (HalfedgeHandle it : hole) {
|
|
VertexHandle vert = mesh.to_vertex_handle(it);
|
|
center += mesh.point(vert);
|
|
length++;
|
|
}
|
|
center /= length;
|
|
VertexHandle center_handle = mesh.new_vertex_dirty(center);
|
|
mesh.set_color(center_handle, mesh.default_color);
|
|
|
|
for (HalfedgeHandle it : hole) {
|
|
mesh.add_face(mesh.from_vertex_handle(it),
|
|
mesh.to_vertex_handle(it),
|
|
center_handle);
|
|
}
|
|
}
|
|
|
|
|
|
void fillHolesDumb(MyMesh &mesh) {
|
|
mesh.holes = findHoles(mesh);
|
|
for (auto hole : mesh.holes) {
|
|
fillHoleDumb(mesh, hole);
|
|
}
|
|
}
|
|
|
|
|
|
void fillHolesImplicit(MyMesh &mesh) {
|
|
}
|