9#include "../../defines.h"
10#include "../concepts.h"
11#include "../../Filters/concepts.h"
13#include PONCA_MULTIARCH_INCLUDE_STD(cmath)
14#include PONCA_MULTIARCH_INCLUDE_CU_STD(limits)
18#define ALGEBRAIC_SPHERE_REQUIREMENTS ProvidesBasketUnitBase<T>&& HasLocalFrame<_NFilter>
45 template <
class DataPo
int,
class _NFilter,
typename T>
46 requires ALGEBRAIC_SPHERE_REQUIREMENTS
49 PONCA_FITTING_DECLARE_DEFAULT_TYPES
70 PONCA_MULTIARCH inline
void init()
75 m_ul = VectorType::Zero();
84 PONCA_MULTIARCH [[nodiscard]]
inline bool isValid()
const
92 PONCA_MULTIARCH_STD_MATH(pow);
93 const Scalar epsilon = Eigen::NumTraits<Scalar>::dummy_precision();
94 const Scalar squaredEpsilon = epsilon * epsilon;
100 template <
typename Other>
101 PONCA_MULTIARCH [[nodiscard]]
inline bool isApprox(
102 const Other& other,
const Scalar& epsilon = Eigen::NumTraits<Scalar>::dummy_precision())
const
104 PONCA_MULTIARCH_STD_MATH(pow);
105 const Scalar squaredEpsilon = epsilon * epsilon;
106 return pow(
m_uc - other.m_uc,
Scalar(2)) < squaredEpsilon &&
107 pow(
m_uq - other.m_uq,
Scalar(2)) < squaredEpsilon &&
m_ul.isApprox(other.m_ul);
113 return !((*this) == other);
150 auto& frame = Base::getNeighborFrame();
153 frame.changeNeighborhoodFrame(newbasis);
165 PONCA_MULTIARCH_STD_MATH(sqrt);
199 PONCA_MULTIARCH_CU_STD_FUNC(numeric_limits);
201 return numeric_limits<Scalar>::infinity();
203 PONCA_MULTIARCH_STD_MATH(sqrt);
214 PONCA_MULTIARCH_CU_STD_FUNC(numeric_limits);
216 return VectorType::Constant(numeric_limits<Scalar>::infinity());
219 return Base::getNeighborFrame().convertToGlobalBasis((
Scalar(-0.5) * b) *
m_ul);
230 const VectorType lq = Base::getNeighborFrame().convertToLocalBasis(_q);
246 PONCA_MULTIARCH [[nodiscard]]
inline VectorType
project(
const VectorType& _q)
const;
253 const VectorType lq = Base::getNeighborFrame().convertToLocalBasis(_q);
265 PONCA_MULTIARCH [[nodiscard]]
inline bool isPlane()
const
267 PONCA_MULTIARCH_STD_MATH(abs);
268 bool bPlanar = Eigen::internal::isApprox(
m_uq,
Scalar(0));
269 bool bReady = Base::isReady();
270 return bReady && bPlanar;
275 PONCA_MULTIARCH [[nodiscard]]
inline Scalar
potentialLocal(
const VectorType& _lq)
const;
281#include "algebraicSphere.hpp"
Algebraic Sphere primitive.
Scalar potential() const
Value of the scalar field at the evaluation point.
VectorType center() const
return the estimated center of the sphere
bool applyPrattNorm()
Normalize the scalar field by the Pratt norm.
void changeBasis(const VectorType &newbasis)
Express the scalar field relatively to a new basis.
const VectorType & primitiveGradient() const
Approximation of the scalar field gradient at the evaluation point.
void init()
Set the scalar field values to 0 and reset the isNormalized() status.
AlgebraicSphere< DataPoint, _NFilter, T > & projectionOperator()
Explicit conversion to AlgebraicSphere , to access methods potentially hidden by heritage.
AlgebraicSphere< DataPoint, _NFilter, T > & implicitPrimitive()
Explicit conversion to AlgebraicSphere , to access methods potentially hidden by heritage.
VectorType primitiveGradientLocal(const VectorType &_lq) const
Approximation of the scalar field gradient at .
Scalar m_uq
Quadratic parameter of the Algebraic hyper-sphere.
Scalar m_uc
Constant parameter of the Algebraic hyper-sphere.
typename DataPoint::Scalar Scalar
Alias to scalar type.
AlgebraicSphere< DataPoint, _NFilter, T > & algebraicSphere()
Explicit conversion to AlgebraicSphere , to access methods potentially hidden by heritage.
bool operator!=(const AlgebraicSphere< DataPoint, NeighborFilter, T > &other) const
Comparison operator, convenience function.
Scalar potentialLocal(const VectorType &_lq) const
Value of the scalar field at the location .
bool m_isNormalized
Is the implicit scalar field normalized using Pratt.
Scalar prattNorm2() const
compute the squared Pratt norm of the implicit scalar field.
bool isApprox(const Other &other, const Scalar &epsilon=Eigen::NumTraits< Scalar >::dummy_precision()) const
Approximate operator.
Scalar prattNorm() const
compute the Pratt norm of the implicit scalar field.
Scalar radius() const
return the estimated radius of the sphere
VectorType m_ul
Linear parameter of the Algebraic hyper-sphere.
typename Base::VectorType VectorType
Alias to vector type.
bool isValid() const
Tell if the sphere as been correctly set. Used to set CONFLICT_ERROR_FOUND during fitting.
bool isPlane() const
Used to know if the fitting result to a plane.
Scalar potential(const VectorType &_q) const
Value of the scalar field at the location .
VectorType primitiveGradient(const VectorType &_q) const
Approximation of the scalar field gradient at .
bool isNormalized() const
State indicating when the sphere has been normalized.
VectorType project(const VectorType &_q) const
Project a point on the algebraic hypersphere.
bool operator==(const AlgebraicSphere< DataPoint, NeighborFilter, T > &other) const
Comparison operator.
This Source Code Form is subject to the terms of the Mozilla Public License, v.