Wildmeshing Toolkit
Loading...
Searching...
No Matches
EmbedSurface.hpp
1#pragma once
2
3#include <set>
4#include <wmtk/Types.hpp>
5#include <wmtk/envelope/Envelope.hpp>
6#include <wmtk/utils/Delaunay.hpp>
7
8namespace wmtk::components::image_simulation {
9
10using ImageData = std::vector<std::vector<std::vector<size_t>>>;
11
25void delaunay_box_mesh(
26 const wmtk::Envelope& envelope,
27 const MatrixXd& vertices,
28 std::vector<wmtk::delaunay::Point3D>& points,
29 std::vector<wmtk::delaunay::Tetrahedron>& tets,
30 Vector3d& box_min,
31 Vector3d& box_max);
32
44void embed_surface(
45 const MatrixXd& V_surface,
46 const MatrixXi& F_surface,
47 const MatrixXd& V_vol,
48 const MatrixXi& T_vol,
49 MatrixXr& V_emb,
50 MatrixXi& T_emb,
51 MatrixXi& F_on_surface);
52
57{
58public:
63 const std::vector<std::string>& img_filenames,
64 const std::vector<Matrix4d>& img_transform = {},
65 const double tol_rel = -1,
66 const double tol_abs = -1);
67
73 void simplify_surface(const double eps, const int num_threads = 0);
74
78 void remove_duplicates(const double eps);
79
80 bool embed_surface(const bool flood_fill = false);
81
85 void consolidate();
86
87 const MatrixXd& V_emb() const { return m_V_emb; }
88 const MatrixXr& V_emb_r() const { return m_V_emb_r; }
89 const MatrixXd& V_surface() const { return m_V_surface; }
90 const MatrixXi& T_emb() const { return m_T_emb; }
91 const MatrixSi& T_tags() const { return m_T_tags; }
92 const MatrixXi& F_on_surface() const { return m_F_on_surface; }
93 const MatrixXi& F_surface() const { return m_F_surface; }
94
101 void write_surf_off(const std::string& filename) const;
108 void write_emb_surf_off(const std::string& filename) const;
109
110 void write_emb_msh(const std::string& filename) const;
111 void write_emb_vtu(const std::string& filename) const;
112
113 std::pair<Vector3d, Vector3d> bbox_minmax() const;
114 std::pair<Vector3d, Vector3d> bbox_surf_minmax() const;
115
116 std::vector<Eigen::Vector3d> V_surf_to_vector() const;
117 std::vector<std::array<size_t, 3>> F_surf_to_vector() const;
118
119private:
120 void V_surf_from_vector(const std::vector<Eigen::Vector3d>& verts);
121 void F_surf_from_vector(const std::vector<std::array<size_t, 3>>& tris);
122
123 void tag_from_winding_number();
124
125private:
126 std::vector<std::string> m_img_filenames;
127 std::vector<ImageData> m_img_datas;
128
129 // the surface separating all tags
130 MatrixXd m_V_surface;
131 MatrixXi m_F_surface;
132
133 std::vector<std::vector<std::pair<size_t, size_t>>> m_F_tags_surface;
134
135 std::vector<size_t> modified_nonmanifold_v;
136
137 // the embedding
138 MatrixXd m_V_emb;
139 MatrixXr m_V_emb_r;
140 MatrixXi m_T_emb;
141 // triangles of the embedding representing the surface
142 MatrixXi m_F_on_surface;
143 // tags on the tets
144 MatrixSi m_T_tags;
145 std::vector<std::set<int64_t>> m_tags;
146
147 // input from triangle meshes
148 std::vector<MatrixXd> Vs;
149 std::vector<MatrixXi> Fs;
150
151public:
152 bool m_smooth_surface = false;
153};
154
155} // namespace wmtk::components::image_simulation
Definition Envelope.hpp:20
void remove_duplicates(const double eps)
Merge vertices that are closer than eps.
Definition EmbedSurface.cpp:646
void write_emb_surf_off(const std::string &filename) const
Write embedded surface.
Definition EmbedSurface.cpp:866
void consolidate()
Remove unreferenced vertices.
Definition EmbedSurface.cpp:814
bool embed_surface(const bool flood_fill=false)
Definition EmbedSurface.cpp:657
void write_surf_off(const std::string &filename) const
Write surface as read from image.
Definition EmbedSurface.cpp:861
void simplify_surface(const double eps, const int num_threads=0)
Simplify the input surface while staying within the eps envelope.
Definition EmbedSurface.cpp:608