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;
155 PONCA_FITTING_DECLARE_FINALIZE
158 PONCA_MULTIARCH
inline void init()
176 template <
typename IteratorBegin,
typename IteratorEnd>
177 PONCA_MULTIARCH
inline FIT_RESULT compute(
const IteratorBegin& begin,
const IteratorEnd& end);
183 template <
typename Po
intContainer>
191 template <
typename IndexRange,
typename Po
intContainer>
199 PONCA_MULTIARCH [[nodiscard]]
inline size_t getNumTriangles()
const {
return static_cast<size_t>(m_nb_vt); }
201 PONCA_FITTING_APIDOC_SETWFUNC
209 PONCA_MULTIARCH [[nodiscard]] std::vector<internal::Triangle<DataPoint>>&
getTriangles() {
return m_triangles; }
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);
226 return !(
this == &other);
231 const CNC& other,
const Scalar& epsilon = Eigen::NumTraits<Scalar>::dummy_precision())
const
233 PONCA_MULTIARCH_STD_MATH(abs);
237 (std::abs(
kmin() - other.
kmin()) < epsilon) && (std::abs(
kmax() - other.
kmax()) < epsilon);
244 PONCA_MULTIARCH [[nodiscard]]
inline Scalar
kmin()
const {
return m_k1; }
247 PONCA_MULTIARCH [[nodiscard]]
inline Scalar
kmax()
const {
return m_k2; }
250 PONCA_MULTIARCH [[nodiscard]]
inline VectorType
kminDirection()
const {
return m_v1; }
253 PONCA_MULTIARCH [[nodiscard]]
inline VectorType
kmaxDirection()
const {
return m_v2; }
256 PONCA_MULTIARCH [[nodiscard]]
inline Scalar
kMean()
const {
return m_H; }
Corrected Normal Current Fit type.
void setNeighborFilter(const NeighborFilter &_nFilter)
Init the WeightFunc, without changing the other internal states.
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.
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.
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.