Ponca  7df32c91629c89b89840c4d7917cb272433f2d2b
Point Cloud Analysis library
Loading...
Searching...
No Matches
cnc.h
1
10#pragma once
11
12#include "defines.h"
13#include "cncFormulaEigen.h"
14#include "weightFunc.h"
15#include "weightKernel.h"
16
17namespace Ponca
18{
19
20 namespace internal
21 {
29 template <class DataPoint>
30 struct Triangle
31 {
32 public:
33 using Scalar = typename DataPoint::Scalar;
34 using VectorType = typename DataPoint::VectorType;
35 using MatrixType = typename DataPoint::MatrixType;
36
37 protected:
38 std::array<VectorType, 3> m_points;
39 std::array<VectorType, 3> m_normals;
40
41 public:
42 Triangle(DataPoint pointA, DataPoint pointB, DataPoint pointC)
43 {
44 m_points = {pointA.pos(), pointB.pos(), pointC.pos()};
45 m_normals = {pointA.normal(), pointB.normal(), pointC.normal()};
46 }
47
48 Triangle(const std::array<VectorType, 3>& points, const std::array<VectorType, 3>& normals)
49 {
50 m_points = points;
51 m_normals = normals;
52 }
53
59 PONCA_MULTIARCH [[nodiscard]] VectorType& getPos(const int index) { return m_points[index]; }
60
61 PONCA_MULTIARCH [[nodiscard]] bool operator==(const Triangle& other) const
62 {
63 return (m_points[0] == other.m_points[0]) && (m_points[1] == other.m_points[1]) &&
64 (m_points[2] == other.m_points[2]);
65 }
66
67 PONCA_MULTIARCH [[nodiscard]] bool operator!=(const Triangle& other) const { return !((*this) == other); }
68
69#define DEFINE_CNC_FUNC(CNC_FUNC, RETURN_TYPE) \
70 template <bool differentOrder = false> \
71 inline RETURN_TYPE CNC_FUNC() \
72 { \
73 return CNCEigen<DataPoint>::CNC_FUNC(m_points[0], m_points[2 - differentOrder], m_points[1 + differentOrder], \
74 m_normals[0], m_normals[2 - differentOrder], \
75 m_normals[1 + differentOrder]); \
76 }
77
78 DEFINE_CNC_FUNC(mu0InterpolatedU, Scalar)
79 DEFINE_CNC_FUNC(mu1InterpolatedU, Scalar)
80 DEFINE_CNC_FUNC(mu2InterpolatedU, Scalar)
81 DEFINE_CNC_FUNC(muXYInterpolatedU, MatrixType)
82 };
83 } // namespace internal
84
89 {
90 UniformGeneration,
91 HexagramGeneration,
92 IndependentGeneration,
93 AvgHexagramGeneration
94 };
95
105 template <class P, TriangleGenerationMethod _method = UniformGeneration>
106 class CNC : ComputeObject<CNC<P, _method>>
107 {
108 protected:
109 enum
110 {
111 PROVIDES_PRINCIPAL_CURVATURES
112 };
113
114 public:
115 using DataPoint = P;
116 using MatrixType = typename DataPoint::MatrixType;
117 using Scalar = typename DataPoint::Scalar;
118 using VectorType = typename DataPoint::VectorType;
119 using DenseVector = Eigen::VectorXd;
120 using DenseMatrix = Eigen::MatrixXd;
121 using NeighborFilter =
123
124 protected:
125 // Basis
126 NeighborFilter m_nFilter;
127
128 // Triangles used for the computation
129 int m_nb_vt{0}; // Number of valid triangles
130 std::vector<internal::Triangle<DataPoint>> m_triangles;
131
132 // Results of the fit
133 Scalar m_A{0}; // Area
134 Scalar m_H{0}; // Mean Curvatures
135 Scalar m_G{0}; // Gaussian Curvatures
136 Scalar m_T11{0}; // T11
137 Scalar m_T12{0}; // T12
138 Scalar m_T13{0}; // T13
139 Scalar m_T22{0}; // T22
140 Scalar m_T23{0}; // T23
141 Scalar m_T33{0}; // T33
142
143 Scalar m_k1{0};
144 Scalar m_k2{0};
145
146 VectorType m_v1;
147 VectorType m_v2;
148
153
154 public:
155 PONCA_FITTING_DECLARE_FINALIZE
156
158 PONCA_MULTIARCH inline void init()
159 {
161 m_A = Scalar(0);
162 m_H = Scalar(0);
163 m_G = Scalar(0);
164
165 m_k1 = Scalar(0);
166 m_k2 = Scalar(0);
167
168 m_triangles.clear();
169 }
170
175 template <typename PointContainer>
176 PONCA_MULTIARCH inline FIT_RESULT compute(const PointContainer& points);
177
183 template <typename IndexRange, typename PointContainer>
184 PONCA_MULTIARCH inline FIT_RESULT computeWithIds(const IndexRange& ids, const PointContainer& points);
185
191 PONCA_MULTIARCH [[nodiscard]] inline size_t getNumTriangles() const { return static_cast<size_t>(m_nb_vt); }
192
193 PONCA_FITTING_APIDOC_SETWFUNC
194 PONCA_MULTIARCH inline void setNeighborFilter(const NeighborFilter& _nFilter) { m_nFilter = _nFilter; }
195
201 PONCA_MULTIARCH [[nodiscard]] std::vector<internal::Triangle<DataPoint>>& getTriangles() { return m_triangles; }
202
204 PONCA_MULTIARCH [[nodiscard]] bool operator==(const CNC& other) const
205 {
206 // We use the matrix to compare the fitting results
207 return (m_eCurrentState == other.m_eCurrentState) && (kMean() == other.kMean()) &&
208 (kmin() == other.kmin()) && (kmax() == other.kmax()) && (kminDirection() == other.kminDirection()) &&
209 (kmaxDirection() == other.kmaxDirection()) && (GaussianCurvature() == other.GaussianCurvature()) &&
210 (m_T11 == other.m_T11) && (m_T12 == other.m_T12) && (m_T13 == other.m_T13) &&
211 (m_T22 == other.m_T22) && (m_T23 == other.m_T23) && (m_T33 == other.m_T33);
212 }
213
215 PONCA_MULTIARCH [[nodiscard]] bool operator!=(const CNC& other) const
216 {
217 // We use the matrix to compare the fitting results
218 return !(this == &other);
219 }
220
222 PONCA_MULTIARCH [[nodiscard]] bool isApprox(
223 const CNC& other, const Scalar& epsilon = Eigen::NumTraits<Scalar>::dummy_precision()) const
224 {
225 PONCA_MULTIARCH_STD_MATH(abs);
226
227 return (m_eCurrentState == other.m_eCurrentState) && (std::abs(kMean() - other.kMean()) < epsilon) &&
228 (std::abs(GaussianCurvature() - other.GaussianCurvature()) < epsilon) &&
229 (std::abs(kmin() - other.kmin()) < epsilon) && (std::abs(kmax() - other.kmax()) < epsilon);
230 }
231
233 PONCA_MULTIARCH [[nodiscard]] inline bool isStable() const { return m_eCurrentState == STABLE; }
234
236 PONCA_MULTIARCH [[nodiscard]] inline Scalar kmin() const { return m_k1; }
237
239 PONCA_MULTIARCH [[nodiscard]] inline Scalar kmax() const { return m_k2; }
240
242 PONCA_MULTIARCH [[nodiscard]] inline VectorType kminDirection() const { return m_v1; }
243
245 PONCA_MULTIARCH [[nodiscard]] inline VectorType kmaxDirection() const { return m_v2; }
246
248 PONCA_MULTIARCH [[nodiscard]] inline Scalar kMean() const { return m_H; }
249
251 PONCA_MULTIARCH [[nodiscard]] inline Scalar GaussianCurvature() const { return m_G; }
252 }; // class CNC
253
254} // namespace Ponca
255
256#include "cnc.hpp"
Aggregator class used to declare specialized structures using CRTP.
Definition basket.h:257
typename P::Scalar Scalar
Scalar type used for computation, as defined from template parameter P
Definition basket.h:265
Corrected Normal Current Fit type.
Definition cnc.h:107
void setNeighborFilter(const NeighborFilter &_nFilter)
Init the WeightFunc, without changing the other internal states.
Definition cnc.h:194
void init()
Set the scalar field values to 0 and reset the isNormalized() status.
Definition cnc.h:158
size_t getNumTriangles() const
Get the number of triangles that were generated with the compute method.
Definition cnc.h:191
bool operator==(const CNC &other) const
Comparison operator.
Definition cnc.h:204
bool isApprox(const CNC &other, const Scalar &epsilon=Eigen::NumTraits< Scalar >::dummy_precision()) const
Approximate operator.
Definition cnc.h:222
Scalar GaussianCurvature() const
Returns an estimate of the Gaussian curvature.
Definition cnc.h:251
VectorType kmaxDirection() const
Returns an estimate of the maximal principal curvature direction.
Definition cnc.h:245
FIT_RESULT m_eCurrentState
Represent the current state of the fit (finalize function update the state)
Definition cnc.h:152
Scalar kmax() const
Returns an estimate of the maximal principal curvature value.
Definition cnc.h:239
bool operator!=(const CNC &other) const
Comparison operator, convenience function.
Definition cnc.h:215
bool isStable() const
Is the fitted primitive ready to use (finalize has been called and the result is stable)
Definition cnc.h:233
Scalar kMean() const
Returns an estimate of the mean curvature.
Definition cnc.h:248
std::vector< internal::Triangle< DataPoint > > & getTriangles()
Returns the triangles.
Definition cnc.h:201
FIT_RESULT compute(const PointContainer &points)
Compute function for STL-like containers.
Definition cnc.hpp:355
FIT_RESULT computeWithIds(const IndexRange &ids, const PointContainer &points)
Compute function that iterates over a subset of sampled points from an STL-Like container.
Definition cnc.hpp:370
VectorType kminDirection() const
Returns an estimate of the minimal principal curvature direction.
Definition cnc.h:242
Scalar kmin() const
Returns an estimate of the minimal principal curvature value.
Definition cnc.h:236
This Source Code Form is subject to the terms of the Mozilla Public License, v.
Definition bitset.h:17
TriangleGenerationMethod
\breif Generation method of the triangles for the Corrected Normal Current formula
Definition cnc.h:89
FIT_RESULT
Enum corresponding to the state of a fitting method (and what the finalize function returns)
Definition enums.h:15
@ UNDEFINED
The fitting is undefined, you can't use it for valid results.
Definition enums.h:22
@ STABLE
The fitting is stable and ready to use.
Definition enums.h:17
ComputeObject is a virtual object that represents an algorithm which can be used with the compute fun...
Definition compute.h:24
Stores the three points and normals of the triangles and provides access to Corrected Normal Current ...
Definition cnc.h:31
VectorType & getPos(const int index)
Get the position of the point at the given index.
Definition cnc.h:59