Wildmeshing Toolkit
Loading...
Searching...
No Matches
TriEdgeSwap.cpp
Go to the documentation of this file.
1#include "TriEdgeSwap.hpp"
2
3#include <wmtk/Mesh.hpp>
4
6
8 : Operation(m)
9 , m_split(m)
10 , m_collapse(m)
11{}
12
13
14std::vector<simplex::Simplex> TriEdgeSwap::execute(const simplex::Simplex& simplex)
15{
16 // input
17 // / \.
18 // / \ .
19 // / f \ .
20 // X--->---
21 // \ /
22 // \ /
23 // \ /
24 const auto split_simplicies = m_split(simplex);
25 if (split_simplicies.empty()) return {};
26 assert(split_simplicies.size() == 1);
27
28 // after split
29 // /|\ .
30 // / | \ .
31 // / | f\ .
32 // ---X-->
33 // \ | /
34 // \ | /
35 // \|/
36
37 // switch also face to keep edge orientation
38 const Tuple collapse_input_tuple = mesh().switch_tuples(
39 split_simplicies.front().tuple(),
40 {PrimitiveType::Edge, PrimitiveType::Triangle});
41 // switch edge - switch face
42 // /|\ .
43 // / ^ \ .
44 // /f | \ .
45 // ---X---
46 // \ | /
47 // \ | /
48 // \|/
49 const auto collapse_simplicies =
50 m_collapse(simplex::Simplex(mesh(), m_collapse.primitive_type(), collapse_input_tuple));
51 if (collapse_simplicies.empty()) return {};
52 assert(collapse_simplicies.size() == 1);
53
54 // collapse output
55 // X
56 // /|\ .
57 // < | \ .
58 // / | \ .
59 // | f | |
60 // \ | /
61 // \ | /
62 // \|/
63 // adjust return tuple to be the swapped edge in the same orientation as the input
64 const Tuple output_tuple = mesh().switch_tuples(
65 collapse_simplicies.front().tuple(),
66 {PrimitiveType::Edge, PrimitiveType::Vertex});
67
68 return {simplex::Simplex::edge(mesh(), output_tuple)};
69}
70
71
72std::vector<simplex::Simplex> TriEdgeSwap::unmodified_primitives(
73 const simplex::Simplex& simplex) const
74{
75 return {simplex};
76}
77
78} // namespace wmtk::operations::composite
Tuple switch_tuples(const Tuple &tuple, const ContainerType &op_sequence) const
Definition Mesh.hpp:953
The Tuple is the basic navigation tool in our mesh data structure.
Definition Tuple.hpp:19
PrimitiveType primitive_type() const override
const Mesh & mesh() const
Definition Operation.hpp:45
std::vector< simplex::Simplex > unmodified_primitives(const simplex::Simplex &simplex) const override
Returns all simplices that will be potentially affected by the operation.
std::vector< simplex::Simplex > execute(const simplex::Simplex &simplex) override
returns an empty vector in case of failure
static Simplex edge(const Mesh &m, const Tuple &t)
Definition Simplex.hpp:61