Wildmeshing Toolkit
Loading...
Searching...
No Matches
Envelope.hpp
1#pragma once
2
3#include <Eigen/Core>
4#include <memory>
5
6// clang-format off
7#include <wmtk/utils/DisableWarnings.hpp>
8#include <fastenvelope/FastEnvelope.h>
9#include <fastenvelope/FastEnvelope2D.h>
10#include <SimpleBVH/BVH.hpp>
11#include <wmtk/utils/EnableWarnings.hpp>
12// clang-format on
13
14namespace wmtk {
16{
17public:
18 virtual ~Envelope() = default;
19 virtual void init(
20 const std::vector<Eigen::Vector3d>& m_ver,
21 const std::vector<Eigen::Vector3i>& m_faces,
22 const double) {};
23 virtual bool is_outside(const std::array<Eigen::Vector3d, 3>& tris) const { return false; };
24 virtual bool is_outside(const Eigen::Vector3d& pts) const { return false; };
25};
26
27class ExactEnvelope : public Envelope, public fastEnvelope::FastEnvelope
28{
29public:
31 : fastEnvelope::FastEnvelope::FastEnvelope() {};
32 ~ExactEnvelope() {};
33 void init(
34 const std::vector<Eigen::Vector3d>& m_ver,
35 const std::vector<Eigen::Vector3i>& m_faces,
36 const double eps)
37 {
38 fastEnvelope::FastEnvelope::init(m_ver, m_faces, eps);
39 }
40 bool is_outside(const std::array<Eigen::Vector3d, 3>& tris) const
41 {
42 return fastEnvelope::FastEnvelope::is_outside(tris);
43 }
44 bool is_outside(const Eigen::Vector3d& pts) const
45 {
46 return fastEnvelope::FastEnvelope::is_outside(pts);
47 }
48};
49
50
52{
53public:
64 enum class Kind { Uninitialized, Triangles3d, Edges3d, Edges2d };
65
66 SampleEnvelope(bool exact = false)
67 : use_exact(exact) {};
76 double eps2 = 1e-6;
96 double eps2_edge = 1e-6;
97 double sampling_dist = 1e-3;
98 bool use_exact = false;
99
113 bool disabled = false;
114 void init(
115 const std::vector<Eigen::Vector3d>& m_ver,
116 const std::vector<Eigen::Vector3i>& m_faces,
117 const double);
118 void init(
119 const std::vector<Eigen::Vector3d>& m_ver,
120 const std::vector<Eigen::Vector2i>& m_edges,
121 const double);
122 void init(
123 const std::vector<Eigen::Vector2d>& m_ver,
124 const std::vector<Eigen::Vector2i>& m_edges,
125 const double);
126
137 void init(const Eigen::MatrixXd& V, const Eigen::MatrixXi& F, const double eps);
138 bool is_outside(const std::array<Eigen::Vector3d, 3>& tris) const;
139 bool is_outside(const std::array<Eigen::Vector3d, 2>& edge) const;
148 virtual bool is_outside(const std::array<Eigen::Vector2d, 2>& edge) const;
149 bool is_outside(const Eigen::Vector3d& pts) const;
150 virtual bool is_outside(const Eigen::Vector2d& pts) const;
151 double nearest_point(const Eigen::Vector3d& pts, Eigen::Vector3d& result) const;
152 double nearest_point(const Eigen::Vector2d& pts, Eigen::Vector2d& result) const;
153
165 const Eigen::Vector2d& p,
166 Eigen::Vector2d& result,
167 bool& on_corner,
168 Eigen::Vector2d& seg_normal,
169 int& feature_id) const;
170
179 const Eigen::Vector3d& p,
180 Eigen::Vector3d& result,
181 int& feature_dim,
182 Eigen::Vector3d& dir,
183 long long& feature_id) const;
184 bool initialized() { return m_bvh != nullptr; };
185
186 Kind kind() const { return m_kind; }
187
188 double squared_distance(const Eigen::Vector3d& p) const;
189 double squared_distance(const Eigen::Vector2d& p) const;
190
191private:
192 void require_exact_kind(Kind expected, const char* query) const;
193 void require_exact_3d(const char* query) const;
194 void require_exact_built(const char* query) const;
195
196 template <typename VertexList>
197 void
198 init_exact_edges(const VertexList& V, const std::vector<Eigen::Vector2i>& F, const double _eps);
199
200 std::vector<int> geo_vertex_ind;
201 std::vector<int> geo_face_ind;
203 std::vector<Eigen::Vector2d> m_v2;
204 std::vector<Eigen::Vector2i> m_e2;
205 std::vector<Eigen::Vector3d> m_v3;
206 std::vector<Eigen::Vector3i> m_f3;
207 std::vector<Eigen::Vector2i> m_e3;
208 std::shared_ptr<SimpleBVH::BVH> m_bvh;
209
210private:
212 fastEnvelope::FastEnvelope exact_envelope;
214 fastEnvelope::FastEnvelope2D exact_envelope_2d;
215 Kind m_kind = Kind::Uninitialized;
218 bool m_exact_built = false;
219};
220} // namespace wmtk
Definition Envelope.hpp:16
Definition Envelope.hpp:28
Definition Envelope.hpp:52
bool disabled
Definition Envelope.hpp:113
std::vector< Eigen::Vector2d > m_v2
Input copies backing nearest_point_feature (filled by the matching init only).
Definition Envelope.hpp:203
fastEnvelope::FastEnvelope exact_envelope
Serves both Triangles3d and Edges3d: FastEnvelope has an init() for each.
Definition Envelope.hpp:212
void init_exact_edges(const VertexList &V, const std::vector< Eigen::Vector2i > &F, const double _eps)
Definition Envelope.cpp:114
bool m_exact_built
Definition Envelope.hpp:218
double eps2_edge
Definition Envelope.hpp:96
fastEnvelope::FastEnvelope2D exact_envelope_2d
Edges2d only. A separate class upstream, not an overload.
Definition Envelope.hpp:214
double eps2
Definition Envelope.hpp:76
virtual bool is_outside(const std::array< Eigen::Vector2d, 2 > &edge) const
Kind
Definition Envelope.hpp:64
void require_exact_kind(Kind expected, const char *query) const
Definition Envelope.cpp:281
void require_exact_3d(const char *query) const
Definition Envelope.cpp:297
double nearest_point_feature(const Eigen::Vector2d &p, Eigen::Vector2d &result, bool &on_corner, Eigen::Vector2d &seg_normal, int &feature_id) const
Definition Envelope.cpp:474