Compare commits
No commits in common. "63074306c2093f0faec3f7cb731978bbfb194ff3" and "45357d3771fa80163f7cd893e0f9215f7edee319" have entirely different histories.
63074306c2
...
45357d3771
@ -43,13 +43,10 @@ void MainWindow::open(const QString &path) {
|
|||||||
for (const VertexHandle &vh : mesh.vertices()) {
|
for (const VertexHandle &vh : mesh.vertices()) {
|
||||||
mesh.set_color(vh, MyMesh::Color(0, 0, 0));
|
mesh.set_color(vh, MyMesh::Color(0, 0, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
for (HalfedgeHandle border : findBorders(mesh)) {
|
|
||||||
setBorderColor(mesh, border, {1, 0, 0});
|
|
||||||
fillHoleDumb(mesh, border);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (glm != nullptr) mesh_viewer.removeOpenGLMesh(glm);
|
if (glm != nullptr) mesh_viewer.removeOpenGLMesh(glm);
|
||||||
|
for (HalfedgeStrip border : findBorders(mesh)) {
|
||||||
|
setBorderColor(mesh, border, {1, 0, 0});
|
||||||
|
}
|
||||||
glm = mesh_viewer.addOpenGLMeshFromOpenMesh(&mesh);
|
glm = mesh_viewer.addOpenGLMeshFromOpenMesh(&mesh);
|
||||||
for (QAction *a : toolbar_actions) {
|
for (QAction *a : toolbar_actions) {
|
||||||
a->setEnabled(true);
|
a->setEnabled(true);
|
||||||
|
@ -1,54 +1,30 @@
|
|||||||
#include "mesh_processing.h"
|
#include "mesh_processing.h"
|
||||||
#include <QGenericMatrix>
|
#include <list>
|
||||||
#include <unordered_set>
|
|
||||||
|
|
||||||
|
|
||||||
std::vector<HalfedgeHandle> findBorders(MyMesh &mesh) {
|
std::vector<HalfedgeStrip> findBorders(MyMesh &mesh) {
|
||||||
std::vector<HalfedgeHandle> borders;
|
std::vector<HalfedgeStrip> borders(1);
|
||||||
std::set<HalfedgeHandle> ignore;
|
size_t current = 0;
|
||||||
for (HalfedgeHandle it : mesh.halfedges()) {
|
for (auto it = mesh.halfedges_begin(); it != mesh.halfedges_end(); ++it) {
|
||||||
if (mesh.is_boundary(it)
|
while (mesh.is_boundary(*it)) {
|
||||||
&& ignore.find(it) == ignore.end()) {
|
borders[current].push_back(*it);
|
||||||
borders.push_back(it);
|
++it;
|
||||||
ignore.insert(it);
|
|
||||||
for (HalfedgeHandle it2 : HalfedgeLoopRange(mesh, it)) {
|
|
||||||
ignore.insert(it2);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
if (borders[current].size() > 0) {
|
||||||
|
borders.emplace_back();
|
||||||
|
current++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (borders.back().size() == 0) {
|
||||||
|
borders.pop_back();
|
||||||
}
|
}
|
||||||
return borders;
|
return borders;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void setBorderColor(MyMesh &mesh, const HalfedgeHandle &border,
|
void setBorderColor(MyMesh &mesh, const HalfedgeStrip &border,
|
||||||
MyMesh::Color color) {
|
MyMesh::Color color) {
|
||||||
for (HalfedgeHandle it : HalfedgeLoopRange(mesh, border)) {
|
for (MyMesh::HalfedgeHandle it : border) {
|
||||||
mesh.set_color(mesh.to_vertex_handle(it), color);
|
mesh.set_color(mesh.to_vertex_handle(it), color);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void fillHoleDumb(MyMesh &mesh, HalfedgeHandle &border) {
|
|
||||||
mesh.request_vertex_status();
|
|
||||||
mesh.request_edge_status();
|
|
||||||
mesh.request_face_status();
|
|
||||||
|
|
||||||
Point center(0, 0, 0);
|
|
||||||
size_t length = 0;
|
|
||||||
for (HalfedgeHandle it : HalfedgeLoopRange(mesh, border)) {
|
|
||||||
VertexHandle vert = mesh.to_vertex_handle(it);
|
|
||||||
center += mesh.point(vert);
|
|
||||||
length++;
|
|
||||||
}
|
|
||||||
center /= length;
|
|
||||||
VertexHandle center_handle = mesh.new_vertex_dirty(center);
|
|
||||||
|
|
||||||
for (HalfedgeHandle it = border;
|
|
||||||
mesh.to_vertex_handle(it) != center_handle;) {
|
|
||||||
HalfedgeHandle next = mesh.next_halfedge_handle(it);
|
|
||||||
mesh.add_face(mesh.from_vertex_handle(it),
|
|
||||||
mesh.to_vertex_handle(it),
|
|
||||||
center_handle);
|
|
||||||
it = next;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -6,12 +6,11 @@
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
|
||||||
std::vector<HalfedgeHandle> findBorders(MyMesh &mesh);
|
typedef std::vector<MyMesh::HalfedgeHandle> HalfedgeStrip;
|
||||||
|
|
||||||
void setBorderColor(MyMesh &mesh, const HalfedgeHandle &border,
|
std::vector<HalfedgeStrip> findBorders(MyMesh &mesh);
|
||||||
|
|
||||||
|
void setBorderColor(MyMesh &mesh, const HalfedgeStrip &border,
|
||||||
MyMesh::Color color);
|
MyMesh::Color color);
|
||||||
|
|
||||||
void fillHoleDumb(MyMesh &mesh, HalfedgeHandle &border);
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
@ -14,27 +14,6 @@ struct MyTraits : public OpenMesh::DefaultTraits {
|
|||||||
typedef OpenMesh::Vec3f Color;
|
typedef OpenMesh::Vec3f Color;
|
||||||
};
|
};
|
||||||
typedef OpenMesh::PolyMesh_ArrayKernelT<MyTraits> MyMesh;
|
typedef OpenMesh::PolyMesh_ArrayKernelT<MyTraits> MyMesh;
|
||||||
typedef MyMesh::FaceHandle FaceHandle;
|
|
||||||
typedef MyMesh::VertexHandle VertexHandle;
|
|
||||||
typedef MyMesh::HalfedgeHandle HalfedgeHandle;
|
|
||||||
typedef MyMesh::EdgeHandle EdgeHandle;
|
|
||||||
typedef MyMesh::Point Point;
|
|
||||||
|
|
||||||
|
|
||||||
class HalfedgeLoopRange {
|
|
||||||
MyMesh &mesh;
|
|
||||||
const HalfedgeHandle &start;
|
|
||||||
|
|
||||||
public:
|
|
||||||
HalfedgeLoopRange(MyMesh &mesh, const HalfedgeHandle &start)
|
|
||||||
:mesh(mesh), start(start) {}
|
|
||||||
MyMesh::HalfedgeLoopIter begin() {
|
|
||||||
return mesh.hl_begin(start);
|
|
||||||
}
|
|
||||||
MyMesh::HalfedgeLoopIter end() {
|
|
||||||
return mesh.hl_end(start);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user