Ponca  7abd0fd82719106ad460aa0f2070dffbe375d727
Point Cloud Analysis library
Loading...
Searching...
No Matches
cnc.h
1
10#pragma once
11
12#include "../defines.h"
13#include "../concepts.h"
14#include "cncFormulaEigen.h"
15
16#include "../Filters/weightFilter.h"
17#include "../Filters/weightKernel.h"
18
19#define CNC_REQUIREMENTS ProvidesNormal<P>
20
21namespace Ponca
22{
23
24 namespace internal
25 {
33 template <class DataPoint>
34 struct Triangle
35 {
36 public:
37 using Scalar = typename DataPoint::Scalar;
38 using VectorType = typename DataPoint::VectorType;
39 using MatrixType = typename DataPoint::MatrixType;
40
41 protected:
42 std::array<VectorType, 3> m_points;
43 std::array<VectorType, 3> m_normals;
44
45 public:
46 Triangle(DataPoint pointA, DataPoint pointB, DataPoint pointC)
47 {
48 m_points = {pointA.pos(), pointB.pos(), pointC.pos()};
49 m_normals = {pointA.normal(), pointB.normal(), pointC.normal()};
50 }
51
52 Triangle(const std::array<VectorType, 3>& points, const std::array<VectorType, 3>& normals)
53 {
54 m_points = points;
55 m_normals = normals;
56 }
57
63 PONCA_MULTIARCH [[nodiscard]] VectorType& getPos(const int index) { return m_points[index]; }
64
65 PONCA_MULTIARCH [[nodiscard]] bool operator==(const Triangle& other) const
66 {
67 return (m_points[0] == other.m_points[0]) && (m_points[1] == other.m_points[1]) &&
68 (m_points[2] == other.m_points[2]);
69 }
70
71 PONCA_MULTIARCH [[nodiscard]] bool operator!=(const Triangle& other) const { return !((*this) == other); }
72
73#define DEFINE_CNC_FUNC(CNC_FUNC, RETURN_TYPE) \
74 template <bool differentOrder = false> \
75 inline RETURN_TYPE CNC_FUNC() \
76 { \
77 return CNCEigen<DataPoint>::CNC_FUNC(m_points[0], m_points[2 - differentOrder], m_points[1 + differentOrder], \
78 m_normals[0], m_normals[2 - differentOrder], \
79 m_normals[1 + differentOrder]); \
80 }
81
82 DEFINE_CNC_FUNC(mu0InterpolatedU, Scalar)
83 DEFINE_CNC_FUNC(mu1InterpolatedU, Scalar)
84 DEFINE_CNC_FUNC(mu2InterpolatedU, Scalar)
85 DEFINE_CNC_FUNC(muXYInterpolatedU, MatrixType)
86 };
87 } // namespace internal
88
93 {
94 UniformGeneration,
95 HexagramGeneration,
96 IndependentGeneration,
97 AvgHexagramGeneration
98 };
99
109 template <class P, TriangleGenerationMethod _method = UniformGeneration>
110 requires CNC_REQUIREMENTS
111 class CNC : ComputeObject<CNC<P, _method>>
112 {
113 public:
114 using DataPoint = P;
115 using MatrixType = typename DataPoint::MatrixType;
116 using Scalar = typename DataPoint::Scalar;
117 using VectorType = typename DataPoint::VectorType;
118 using DenseVector = Eigen::VectorXd;
119 using DenseMatrix = Eigen::MatrixXd;
120 using NeighborFilter =
122 internal::ConvertDataPointToNormal<DataPoint>>;
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
176 template <typename IteratorBegin, typename IteratorEnd>
177 PONCA_MULTIARCH inline FIT_RESULT compute(const IteratorBegin& begin, const IteratorEnd& end);
178
183 template <typename PointContainer>
184 PONCA_MULTIARCH inline FIT_RESULT compute(const PointContainer& points);
185
191 template <typename IndexRange, typename PointContainer>
192 PONCA_MULTIARCH inline FIT_RESULT computeWithIds(const IndexRange& ids, const PointContainer& points);
193
199 PONCA_MULTIARCH [[nodiscard]] inline size_t getNumTriangles() const { return static_cast<size_t>(m_nb_vt); }
200
201 PONCA_FITTING_APIDOC_SETWFUNC
202 PONCA_MULTIARCH inline void setNeighborFilter(const NeighborFilter& _nFilter) { m_nFilter = _nFilter; }
203
209 PONCA_MULTIARCH [[nodiscard]] std::vector<internal::Triangle<DataPoint>>& getTriangles() { return m_triangles; }
210
212 PONCA_MULTIARCH [[nodiscard]] bool operator==(const CNC& other) const
213 {
214 // We use the matrix to compare the fitting results
215 return (m_eCurrentState == other.m_eCurrentState) && (kMean() == other.kMean()) &&
216 (kmin() == other.kmin()) && (kmax() == other.kmax()) && (kminDirection() == other.kminDirection()) &&
217 (kmaxDirection() == other.kmaxDirection()) && (GaussianCurvature() == other.GaussianCurvature()) &&
218 (m_T11 == other.m_T11) && (m_T12 == other.m_T12) && (m_T13 == other.m_T13) &&
219 (m_T22 == other.m_T22) && (m_T23 == other.m_T23) && (m_T33 == other.m_T33);
220 }
221
223 PONCA_MULTIARCH [[nodiscard]] bool operator!=(const CNC& other) const
224 {
225 // We use the matrix to compare the fitting results
226 return !(this == &other);
227 }
228
230 PONCA_MULTIARCH [[nodiscard]] bool isApprox(
231 const CNC& other, const Scalar& epsilon = Eigen::NumTraits<Scalar>::dummy_precision()) const
232 {
233 PONCA_MULTIARCH_STD_MATH(abs);
234
235 return (m_eCurrentState == other.m_eCurrentState) && (std::abs(kMean() - other.kMean()) < epsilon) &&
236 (std::abs(GaussianCurvature() - other.GaussianCurvature()) < epsilon) &&
237 (std::abs(kmin() - other.kmin()) < epsilon) && (std::abs(kmax() - other.kmax()) < epsilon);
238 }
239
241 PONCA_MULTIARCH [[nodiscard]] inline bool isStable() const { return m_eCurrentState == STABLE; }
242
244 PONCA_MULTIARCH [[nodiscard]] inline Scalar kmin() const { return m_k1; }
245
247 PONCA_MULTIARCH [[nodiscard]] inline Scalar kmax() const { return m_k2; }
248
250 PONCA_MULTIARCH [[nodiscard]] inline VectorType kminDirection() const { return m_v1; }
251
253 PONCA_MULTIARCH [[nodiscard]] inline VectorType kmaxDirection() const { return m_v2; }
254
256 PONCA_MULTIARCH [[nodiscard]] inline Scalar kMean() const { return m_H; }
257
259 PONCA_MULTIARCH [[nodiscard]] inline Scalar GaussianCurvature() const { return m_G; }
260 }; // class CNC
261
262} // namespace Ponca
263
264#include "cnc.hpp"
Corrected Normal Current Fit type.
Definition cnc.h:112
void setNeighborFilter(const NeighborFilter &_nFilter)
Init the WeightFunc, without changing the other internal states.
Definition cnc.h:202
void init()
Set the scalar field values to 0 and reset the isNormalized() status.
Definition cnc.h:158
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:433
size_t getNumTriangles() const
Get the number of triangles that were generated with the compute method.
Definition cnc.h:199
bool operator==(const CNC &other) const
Comparison operator.
Definition cnc.h:212
bool isApprox(const CNC &other, const Scalar &epsilon=Eigen::NumTraits< Scalar >::dummy_precision()) const
Approximate operator.
Definition cnc.h:230
Scalar GaussianCurvature() const
Returns an estimate of the Gaussian curvature.
Definition cnc.h:259
VectorType kmaxDirection() const
Returns an estimate of the maximal principal curvature direction.
Definition cnc.h:253
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:247
bool operator!=(const CNC &other) const
Comparison operator, convenience function.
Definition cnc.h:223
bool isStable() const
Is the fitted primitive ready to use (finalize has been called and the result is stable)
Definition cnc.h:241
Scalar kMean() const
Returns an estimate of the mean curvature.
Definition cnc.h:256
FIT_RESULT compute(const IteratorBegin &begin, const IteratorEnd &end)
Convenience function for STL-like iterators Add neighbors stored in a container using STL-like iterat...
Definition cnc.hpp:400
std::vector< internal::Triangle< DataPoint > > & getTriangles()
Returns the triangles.
Definition cnc.h:209
VectorType kminDirection() const
Returns an estimate of the minimal principal curvature direction.
Definition cnc.h:250
Scalar kmin() const
Returns an estimate of the minimal principal curvature value.
Definition cnc.h:244
This Source Code Form is subject to the terms of the Mozilla Public License, v.
Definition concepts.h:11
TriangleGenerationMethod
\breif Generation method of the triangles for the Corrected Normal Current formula
Definition cnc.h:93
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:35
VectorType & getPos(const int index)
Get the position of the point at the given index.
Definition cnc.h:63