3#include <wmtk/SurfaceTagAttributes.h>
4#include <wmtk/envelope/Envelope.hpp>
5#include <wmtk/utils/Logger.hpp>
11#include <shared_mutex>
49 , m_members(std::move(members))
52 bool is_outside(
const std::array<Eigen::Vector3d, 3>& tris)
const override
54 for (
const auto& e : m_members) {
55 if (e->is_outside(tris))
return true;
60 bool is_outside(
const Eigen::Vector3d& pts)
const override
62 for (
const auto& e : m_members) {
63 if (e->is_outside(pts))
return true;
68 bool is_outside(
const std::array<Eigen::Vector2d, 2>& edge)
const override
70 for (
const auto& e : m_members) {
71 if (e->is_outside(edge))
return true;
76 bool is_outside(
const Eigen::Vector2d& pts)
const override
78 for (
const auto& e : m_members) {
79 if (e->is_outside(pts))
return true;
84 const std::vector<std::shared_ptr<Envelope>>& members()
const {
return m_members; }
87 std::vector<std::shared_ptr<Envelope>> m_members;
96 explicit UnionEnvelope(std::vector<std::shared_ptr<Envelope>> members)
98 , m_members(std::move(members))
101 bool is_outside(
const std::array<Eigen::Vector3d, 3>& tris)
const override
103 for (
const auto& e : m_members) {
104 if (!e->is_outside(tris))
return false;
109 bool is_outside(
const Eigen::Vector3d& pts)
const override
111 for (
const auto& e : m_members) {
112 if (!e->is_outside(pts))
return false;
117 bool is_outside(
const std::array<Eigen::Vector2d, 2>& edge)
const override
119 for (
const auto& e : m_members) {
120 if (!e->is_outside(edge))
return false;
125 bool is_outside(
const Eigen::Vector2d& pts)
const override
127 for (
const auto& e : m_members) {
128 if (!e->is_outside(pts))
return false;
134 std::vector<std::shared_ptr<Envelope>> m_members;
156 void set(std::vector<std::shared_ptr<Envelope>> members)
160 "{} inputs; a tracked simplex records its inputs in {} bits, so at most {} are "
166 m_members = std::move(members);
170 size_t size()
const {
return m_members.size(); }
171 bool empty()
const {
return m_members.empty(); }
172 const std::shared_ptr<Envelope>& member(
size_t i)
const {
return m_members[i]; }
174 std::shared_ptr<Envelope> containment(
const InputSet
set)
const
177 if ((
set & (
set - 1)) == 0)
return m_members[lowest_bit(
set)];
181 std::shared_lock<std::shared_mutex> lock(m_mutex);
185 std::unique_lock<std::shared_mutex> lock(m_mutex);
188 std::vector<std::shared_ptr<Envelope>> members;
189 for (
size_t i = 0; i < m_members.size(); ++i) {
190 if (
set & (InputSet(1) << i)) members.push_back(m_members[i]);
192 e = std::make_shared<IntersectionEnvelope>(std::move(members));
198 template <
typename Po
int>
199 std::shared_ptr<Envelope>
pull(
const InputSet
set,
const Point& p)
const
202 if ((
set & (
set - 1)) == 0)
return m_members[lowest_bit(
set)];
203 std::shared_ptr<Envelope> best;
205 for (
size_t i = 0; i < m_members.size(); ++i) {
206 if (!(
set & (InputSet(1) << i)))
continue;
207 const double d2 = m_members[i]->squared_distance(p);
217 void check(
const InputSet
set)
const
221 "a tracked simplex has an empty input set: the insertion or an operation did "
225 (
set >> m_members.size())) {
227 "input set {:#x} names an input beyond the {} that have envelopes",
232 static size_t lowest_bit(
const InputSet
set)
235 while (!(
set & (InputSet(1) << i))) ++i;
239 std::vector<std::shared_ptr<Envelope>> m_members;
242 mutable std::shared_mutex m_mutex;
Definition Envelope.hpp:19
Definition CompositeEnvelopes.hpp:45
bool is_outside(const std::array< Eigen::Vector3d, 3 > &tris) const override
Definition CompositeEnvelopes.hpp:52
static constexpr int max_inputs
One input per bit of InputSet: the width is set there, and only there.
Definition SurfaceTagAttributes.h:130
Definition CompositeEnvelopes.hpp:94
bool is_outside(const std::array< Eigen::Vector3d, 3 > &tris) const override
Definition CompositeEnvelopes.hpp:101