Wildmeshing Toolkit
Loading...
Searching...
No Matches
TriFaceSplit.cpp
Go to the documentation of this file.
1#include "TriFaceSplit.hpp"
2
3#include <wmtk/Mesh.hpp>
4
6
8 : Operation(m)
9 , m_split(m)
10 , m_collapse(m)
11{}
12
13std::vector<simplex::Simplex> TriFaceSplit::execute(const simplex::Simplex& simplex)
14{
15 // input
16 // p1
17 // / \ .
18 // / f \ .
19 // / \ .
20 // p0-->--p2
21 // \ /
22 // \ /
23 // \ /
24
25 const auto split_simplicies = m_split(simplex::Simplex::edge(mesh(), simplex.tuple()));
26 if (split_simplicies.empty()) return {};
27 assert(split_simplicies.size() == 1);
28 const Tuple split_ret = split_simplicies.front().tuple();
29
30
31 // after split
32 // /|\ .
33 // / | \ .
34 // / | f\ .
35 // ---X-->
36 // \ | /
37 // \ | /
38 // \|/
39
40 // switch edge - switch face
41 // /|\ .
42 // / v \ .
43 // /f | \ .
44 // ---X---
45 // \ | /
46 // \ | /
47 // \|/
48 const Tuple second_split_input_tuple =
50 const auto second_split_simplicies =
51 m_split(simplex::Simplex::edge(mesh(), second_split_input_tuple));
52 if (second_split_simplicies.empty()) return {};
53 assert(second_split_simplicies.size() == 1);
54 const Tuple second_split_ret = second_split_simplicies.front().tuple();
55
56 // after split
57 //
58 // /|\ .
59 // / | \ .
60 // / X \ .
61 // / /|\ \ .
62 // /__/_v_\__\ .
63 // \ | /
64 // \ | /
65 // \ | /
66 // \|/
67
68 // collapse the split ret
69 // /|\ .
70 // / | \ .
71 // / /|\ \ .
72 // / / | \ \ .
73 // |/__X__>
74 // \ | /
75 // \ | /
76 // \ | /
77 // \|/
78
79 const Tuple col1_input_tuple =
81 const auto collapse_simplicies = m_collapse(simplex::Simplex::edge(mesh(), col1_input_tuple));
82 if (collapse_simplicies.empty()) return {};
83 assert(collapse_simplicies.size() == 1);
84 const Tuple col1_ret = collapse_simplicies.front().tuple();
85
86 // collapse output
87 // /| \ .
88 // / | \ .
89 // / * \ .
90 // / / \ \ .
91 // / / f > \ .
92 // |/_ _ _ _ \|
93 // \ /
94 // \ /
95 // \ /
96 // \ /
97 // return new vertex's tuple
98 const Tuple output_tuple =
100
101 return {simplex::Simplex::vertex(mesh(), output_tuple)};
102}
103
104std::vector<simplex::Simplex> TriFaceSplit::unmodified_primitives(
105 const simplex::Simplex& simplex) const
106{
107 return {simplex};
108}
109
110} // 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
const Mesh & mesh() const
Definition Operation.hpp:45
std::vector< simplex::Simplex > execute(const simplex::Simplex &simplex) override
returns an empty vector in case of failure
std::vector< simplex::Simplex > unmodified_primitives(const simplex::Simplex &simplex) const override
Returns all simplices that will be potentially affected by the operation.
static Simplex edge(const Mesh &m, const Tuple &t)
Definition Simplex.hpp:61
static Simplex vertex(const Mesh &m, const Tuple &t)
Definition Simplex.hpp:56
const Tuple & tuple() const
Definition Simplex.hpp:53