ITK  6.0.0
Insight Toolkit
itkDiscretePrincipalCurvaturesQuadEdgeMeshFilter.h
Go to the documentation of this file.
1/*=========================================================================
2 *
3 * Copyright NumFOCUS
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * https://www.apache.org/licenses/LICENSE-2.0.txt
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 *=========================================================================*/
18#ifndef itkDiscretePrincipalCurvaturesQuadEdgeMeshFilter_h
19#define itkDiscretePrincipalCurvaturesQuadEdgeMeshFilter_h
20
23
24namespace itk
25{
33template <typename TInputMesh, typename TOutputMesh = TInputMesh>
35 : public DiscreteCurvatureQuadEdgeMeshFilter<TInputMesh, TOutputMesh>
36{
37public:
38 ITK_DISALLOW_COPY_AND_MOVE(DiscretePrincipalCurvaturesQuadEdgeMeshFilter);
39
44
45 using typename Superclass::InputMeshType;
46 using typename Superclass::InputMeshPointer;
47 using typename Superclass::OutputMeshType;
48 using typename Superclass::OutputMeshPointer;
51 using typename Superclass::OutputPointType;
52 using typename Superclass::OutputVectorType;
53 using typename Superclass::OutputCoordType;
56 using typename Superclass::OutputQEType;
57 using typename Superclass::OutputMeshTraits;
59
60 using typename Superclass::TriangleType;
61
63 itkOverrideGetNameOfClassMacro(DiscretePrincipalCurvaturesQuadEdgeMeshFilter);
64
66
67#ifdef ITK_USE_CONCEPT_CHECKING
68 // Begin concept checking
70 // End concept checking
71#endif
72
73protected:
75 : m_Gaussian(0.0)
76 , m_Mean(0.0)
77 {}
79
82
83 void
85 {
86 const OutputMeshPointer output = this->GetOutput();
87
88 OutputQEType * qe = iP.GetEdge();
89
90 m_Mean = 0.;
91 m_Gaussian = 0.;
92
93 if (qe != nullptr)
94 {
95 OutputVectorType Laplace{};
96
97 OutputQEType * qe_it = qe;
98
99 OutputCurvatureType area(0.);
100 OutputCurvatureType sum_theta(0.);
101
102 if (qe_it != qe_it->GetOnext())
103 {
104 qe_it = qe;
105
106 OutputVectorType normal{};
107 const CoefficientType coefficent;
108 do
109 {
110 OutputQEType * qe_it2 = qe_it->GetOnext();
111 const OutputPointType q0 = output->GetPoint(qe_it->GetDestination());
112 const OutputPointType q1 = output->GetPoint(qe_it2->GetDestination());
113
114 const OutputCoordType temp_coeff = coefficent(output, qe_it);
115 Laplace += temp_coeff * (iP - q0);
116
117 // Compute Angle;
118 sum_theta += static_cast<OutputCurvatureType>(TriangleType::ComputeAngle(q0, iP, q1));
119
120 const OutputCurvatureType temp_area = this->ComputeMixedArea(qe_it, qe_it2);
121 area += temp_area;
122
123 const OutputVectorType face_normal = TriangleType::ComputeNormal(q0, iP, q1);
124 normal += face_normal;
125
126 qe_it = qe_it2;
127 } while (qe_it != qe);
128
129 if (area > 1e-10)
130 {
131 area = 1. / area;
132 Laplace *= 0.25 * area;
133 m_Mean = Laplace * normal;
134 m_Gaussian = (2. * itk::Math::pi - sum_theta) * area;
135 }
136 }
137 }
138 }
139
140 virtual OutputCurvatureType
142 {
143 return std::max(static_cast<OutputCurvatureType>(0.), m_Mean * m_Mean - m_Gaussian);
144 }
145};
146} // namespace itk
147
148#endif
Compute a matrix filed by Conformal Coefficients of the edge wherever two vertices are connected by a...
typename OutputMeshType::PointsContainerPointer OutputPointsContainerPointer
typename OutputMeshType::PointsContainerIterator OutputPointsContainerIterator
typename OutputMeshType::PointIdentifier OutputPointIdentifier
OutputCurvatureType ComputeMixedArea(OutputQEType *iQE1, OutputQEType *iQE2)
typename OutputPointType::CoordinateType OutputCoordType
typename OutputMeshType::CellIdentifier OutputCellIdentifier
Light weight base class for most itk classes.
typename OutputMeshType::Pointer OutputMeshPointer
Definition: itkMeshSource.h:69
OutputMeshType * GetOutput()
static VectorType ComputeNormal(const PointType &iA, const PointType &iB, const PointType &iC)
Compute Normal vector to the triangle formed by (iA,iB,iC)
static CoordinateType ComputeAngle(const PointType &iP1, const PointType &iP2, const PointType &iP3)
Compute angles (iA,iB,iC)
#define itkConceptMacro(name, concept)
static constexpr double pi
Definition: itkMath.h:66
static constexpr double e
Definition: itkMath.h:56
The "itk" namespace contains all Insight Segmentation and Registration Toolkit (ITK) classes....