File: itkQuadEdgeMeshEulerOperatorSplitFacetFunction.hxx

package info (click to toggle)
insighttoolkit5 5.4.3-5
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 704,384 kB
  • sloc: cpp: 783,592; ansic: 628,724; xml: 44,704; fortran: 34,250; python: 22,874; sh: 4,078; pascal: 2,636; lisp: 2,158; makefile: 464; yacc: 328; asm: 205; perl: 203; lex: 146; tcl: 132; javascript: 98; csh: 81
file content (107 lines) | stat: -rw-r--r-- 3,666 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
/*=========================================================================
 *
 *  Copyright NumFOCUS
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *         https://www.apache.org/licenses/LICENSE-2.0.txt
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 *=========================================================================*/
#ifndef itkQuadEdgeMeshEulerOperatorSplitFacetFunction_hxx
#define itkQuadEdgeMeshEulerOperatorSplitFacetFunction_hxx


namespace itk
{
template <typename TMesh, typename TQEType>
auto
QuadEdgeMeshEulerOperatorSplitFacetFunction<TMesh, TQEType>::Evaluate(QEType * h, QEType * g) -> OutputType
{
  //
  //  g->Dest() ---<----- X                    destPid  --------- X        //
  //         /     g       \                         / \           \       //
  //        /               \                   dLnext  \           \      //
  //       /                 \                     /     \           \     //
  //      /                   \                   v       ^           \    //
  //     /      g->Left()      \                 /         \           \   //
  //    X           =           X               X        newEdge        X  //
  //     \      h->Left()      /                 \           \         /   //
  //      \                   /                   \           \       ^    //
  //       \                 /                     \           \     /     //
  //        \               /                       \           \ oLnext   //
  //         \       h     /                         \           \ /       //
  //          X ----->--- h->Dest()                   X --------- orgPid   //
  //

  if (!h || !g)
  {
    itkDebugMacro("At least one of the Input is not an edge.");
    return ((QEType *)nullptr);
  }

  if (!this->m_Mesh)
  {
    itkDebugMacro("No mesh present.");
    return ((QEType *)nullptr);
  }

  if (h == g)
  {
    itkDebugMacro("Provided edges should be different.");
    return ((QEType *)nullptr);
  }

  if (h->GetLeft() != g->GetLeft())
  {
    itkDebugMacro("The edges are not around the same face.");
    return ((QEType *)nullptr);
  }

  if ((h->GetLnext() == g) || (g->GetLnext() == h))
  {
    itkDebugMacro("Provided edges should NOT be consecutive.");
    return ((QEType *)nullptr);
  }

  using VertexRefType = typename MeshType::VertexRefType;

  this->m_Mesh->DeleteFace(h->GetLeft());
  VertexRefType orgPid = h->GetDestination();
  VertexRefType destPid = g->GetDestination();

  // Create an new isolated edge and set its geometry:
  auto *   newEdge = new EdgeCellType;
  QEType * newEdgeGeom = newEdge->GetQEGeom();

  // see the code of e.g. AddFace
  newEdgeGeom->SetOrigin(orgPid);
  newEdgeGeom->SetDestination(destPid);

  // Insert newEdge at Org
  QEType * oLnext = h->GetLnext();
  oLnext->InsertAfterNextBorderEdgeWithUnsetLeft(newEdgeGeom);
  // Insert newEdge at Dest
  QEType * dLnext = g->GetLnext();
  dLnext->InsertAfterNextBorderEdgeWithUnsetLeft(newEdgeGeom->GetSym());

  // Add the new edge to the container
  this->m_Mesh->PushOnContainer(newEdge);

  // Build two new faces
  this->m_Mesh->AddFace(h);
  this->m_Mesh->AddFace(g);
  this->m_Mesh->Modified();
  return (newEdgeGeom);
}

} // end namespace itk

#endif