12#include "../defines.h"
13#include "../concepts.h"
14#include "cncFormulaEigen.h"
16#include "../Filters/weightFilter.h"
17#include "../Filters/weightKernel.h"
19#define CNC_REQUIREMENTS ProvidesNormal<P>
33 template <
class DataPo
int>
37 using Scalar =
typename DataPoint::Scalar;
38 using VectorType =
typename DataPoint::VectorType;
39 using MatrixType =
typename DataPoint::MatrixType;
42 std::array<VectorType, 3> m_points;
43 std::array<VectorType, 3> m_normals;
46 Triangle(DataPoint pointA, DataPoint pointB, DataPoint pointC)
48 m_points = {pointA.pos(), pointB.pos(), pointC.pos()};
49 m_normals = {pointA.normal(), pointB.normal(), pointC.normal()};
52 Triangle(
const std::array<VectorType, 3>& points,
const std::array<VectorType, 3>& normals)
63 PONCA_MULTIARCH [[nodiscard]] VectorType&
getPos(
const int index) {
return m_points[index]; }
65 PONCA_MULTIARCH [[nodiscard]]
bool operator==(
const Triangle& other)
const
67 return (m_points[0] == other.m_points[0]) && (m_points[1] == other.m_points[1]) &&
68 (m_points[2] == other.m_points[2]);
71 PONCA_MULTIARCH [[nodiscard]]
bool operator!=(
const Triangle& other)
const {
return !((*this) == other); }
73#define DEFINE_CNC_FUNC(CNC_FUNC, RETURN_TYPE) \
74 template <bool differentOrder = false> \
75 inline RETURN_TYPE CNC_FUNC() \
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]); \
82 DEFINE_CNC_FUNC(mu0InterpolatedU, Scalar)
83 DEFINE_CNC_FUNC(mu1InterpolatedU, Scalar)
84 DEFINE_CNC_FUNC(mu2InterpolatedU, Scalar)
85 DEFINE_CNC_FUNC(muXYInterpolatedU, MatrixType)
96 IndependentGeneration,
109 template <
class P, TriangleGenerationMethod _method = UniformGeneration>
110 requires CNC_REQUIREMENTS
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;
122 internal::ConvertDataPointToNormal<DataPoint>>;
130 std::vector<internal::Triangle<DataPoint>> m_triangles;
158 PONCA_FITTING_DECLARE_FINALIZE
161 PONCA_MULTIARCH inline
void init()
179 template <
typename IteratorBegin,
typename IteratorEnd>
180 PONCA_MULTIARCH
inline FIT_RESULT compute(
const IteratorBegin& begin,
const IteratorEnd& end);
186 template <
typename Po
intContainer>
194 template <
typename IndexRange,
typename Po
intContainer>
202 PONCA_MULTIARCH [[nodiscard]]
inline size_t getNumTriangles()
const {
return static_cast<size_t>(m_nb_vt); }
204 PONCA_FITTING_APIDOC_SETWFUNC
205 PONCA_MULTIARCH
inline void setNeighborFilter(
const NeighborFilter& _nFilter) { m_nFilter = _nFilter; }
212 PONCA_MULTIARCH [[nodiscard]] std::vector<internal::Triangle<DataPoint>>&
getTriangles() {
return m_triangles; }
221 (m_T11 == other.m_T11) && (m_T12 == other.m_T12) && (m_T13 == other.m_T13) &&
222 (m_T22 == other.m_T22) && (m_T23 == other.m_T23) && (m_T33 == other.m_T33);
229 return !(
this == &other);
234 const CNC& other,
const Scalar& epsilon = Eigen::NumTraits<Scalar>::dummy_precision())
const
236 PONCA_MULTIARCH_STD_MATH(abs);
240 (std::abs(
kmin() - other.
kmin()) < epsilon) && (std::abs(
kmax() - other.
kmax()) < epsilon);
247 PONCA_MULTIARCH [[nodiscard]]
inline Scalar
kmin()
const {
return m_k1; }
250 PONCA_MULTIARCH [[nodiscard]]
inline Scalar
kmax()
const {
return m_k2; }
253 PONCA_MULTIARCH [[nodiscard]]
inline VectorType
kminDirection()
const {
return m_v1; }
256 PONCA_MULTIARCH [[nodiscard]]
inline VectorType
kmaxDirection()
const {
return m_v2; }
259 PONCA_MULTIARCH [[nodiscard]]
inline Scalar
kMean()
const {
return m_H; }
Corrected Normal Current Fit type.
void init()
Set the scalar field values to 0 and reset the isNormalized() status.
FIT_RESULT computeWithIds(const IndexRange &ids, const PointContainer &points)
Compute function that iterates over a subset of sampled points from an STL-Like container.
size_t getNumTriangles() const
Get the number of triangles that were generated with the compute method.
CNC< P, _method > & curvatureTensor()
Explicit conversion to CLASSNAME, to access methods potentially hidden by heritage.
bool operator==(const CNC &other) const
Comparison operator.
bool isApprox(const CNC &other, const Scalar &epsilon=Eigen::NumTraits< Scalar >::dummy_precision()) const
Approximate operator.
Scalar GaussianCurvature() const
Returns an estimate of the Gaussian curvature.
VectorType kmaxDirection() const
Returns an estimate of the maximal principal curvature direction.
FIT_RESULT m_eCurrentState
Represent the current state of the fit (finalize function update the state)
Scalar kmax() const
Returns an estimate of the maximal principal curvature value.
CNC< P, _method > & meanCurvature()
Explicit conversion to CLASSNAME, to access methods potentially hidden by heritage.
bool operator!=(const CNC &other) const
Comparison operator, convenience function.
bool isStable() const
Is the fitted primitive ready to use (finalize has been called and the result is stable)
Scalar kMean() const
Returns an estimate of the mean curvature.
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...
std::vector< internal::Triangle< DataPoint > > & getTriangles()
Returns the triangles.
VectorType kminDirection() const
Returns an estimate of the minimal principal curvature direction.
Scalar kmin() const
Returns an estimate of the minimal principal curvature value.
This Source Code Form is subject to the terms of the Mozilla Public License, v.
TriangleGenerationMethod
\breif Generation method of the triangles for the Corrected Normal Current formula
FIT_RESULT
Enum corresponding to the state of a fitting method (and what the finalize function returns)
@ UNDEFINED
The fitting is undefined, you can't use it for valid results.
@ STABLE
The fitting is stable and ready to use.
ComputeObject is a virtual object that represents an algorithm which can be used with the compute fun...
Stores the three points and normals of the triangles and provides access to Corrected Normal Current ...
VectorType & getPos(const int index)
Get the position of the point at the given index.