Wildmeshing Toolkit
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 
13 std::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 
104 std::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:967
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.
const Tuple & tuple() const
Definition: Simplex.hpp:53
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