7template <
class DataPo
int,
class _NFilter,
typename T>
19template <
class DataPo
int,
class _NFilter,
typename T>
25 m_sumDotPP +=
w *
localQ.squaredNorm();
28template <
class DataPo
int,
class _NFilter,
typename T>
31 PONCA_MULTIARCH_STD_MATH(
sqrt);
32 PONCA_MULTIARCH_STD_MATH(
max);
33 PONCA_MULTIARCH_STD_MATH(
abs);
36 if (Base::finalize() !=
STABLE)
37 return Base::m_eCurrentState;
38 if (Base::getNumNeighbors() < DataPoint::Dim)
40 if (Base::algebraicSphere().isValid())
43 Base::m_eCurrentState = Base::getNumNeighbors() < 2 * DataPoint::Dim ?
UNSTABLE :
STABLE;
46 Scalar epsilon = Eigen::NumTraits<Scalar>::dummy_precision();
50 m_nume = (m_sumDotPN -
invSumW * Base::m_sumP.dot(Base::m_sumN));
52 m_deno = m_sumDotPP -
den1;
55 if (
abs(m_deno) <= epsilon *
max(m_sumDotPP,
den1))
61 Base::m_ul =
s * Base::m_ul;
62 Base::m_uc =
s * Base::m_uc;
68 Base::m_uq =
Scalar(.5) * m_nume / m_deno;
69 Base::m_ul = (Base::m_sumN - Base::m_sumP * (
Scalar(2.) * Base::m_uq)) *
invSumW;
70 Base::m_uc = -
invSumW * (Base::m_ul.dot(Base::m_sumP) + m_sumDotPP * Base::m_uq);
73 Base::m_isNormalized =
false;
75 return Base::m_eCurrentState;
78template <
class DataPo
int,
class _NFilter,
int DiffType,
typename T>
85 m_dSumDotPN.setZero();
86 m_dSumDotPP.setZero();
95template <
class DataPo
int,
class _NFilter,
int DiffType,
typename T>
103 m_dSumDotPP +=
dw *
localQ.squaredNorm();
106template <
class DataPo
int,
class _NFilter,
int DiffType,
typename T>
109 PONCA_MULTIARCH_STD_MATH(
sqrt);
124 (Base::getWeightSum() * (Base::m_sumN.transpose() * Base::m_dSumP +
125 Base::m_sumP.transpose() * m_dSumN) -
126 Base::m_dSumW * Base::m_sumP.
dot(Base::m_sumN));
129 (
Scalar(2.) * Base::getWeightSum() * Base::m_sumP.transpose() * Base::m_dSumP -
130 Base::m_dSumW * Base::m_sumP.dot(Base::m_sumP));
136 m_dUl =
invSumW * (m_dSumN - Base::m_ul * Base::m_dSumW -
137 Scalar(2.) * (Base::m_dSumP * Base::m_uq + Base::m_sumP * m_dUq));
139 -
invSumW * (Base::m_sumP.transpose() * m_dUl + Base::m_sumDotPP * m_dUq +
140 Base::m_ul.transpose() * Base::m_dSumP + Base::m_uq * m_dSumDotPP + Base::m_dSumW * Base::m_uc);
143 return Base::m_eCurrentState;
146template <
class DataPo
int,
class _NFilter,
int DiffType,
typename T>
154 if (Base::isSpaceDer())
161template <
class DataPo
int,
class _NFilter,
int DiffType,
typename T>
166 if (Base::isSpaceDer())
171template <
class DataPo
int,
class _NFilter,
int DiffType,
typename T>
174 if (Base::isNormalized())
177 PONCA_MULTIARCH_STD_MATH(
sqrt);
188 Base::applyPrattNorm();
Aggregator class used to declare specialized structures using CRTP.
[OrientedSphereFit Definition]
typename Base::VectorType VectorType
Alias to vector type.
typename Base::ScalarArray ScalarArray
Alias to scalar derivatives array.
typename DataPoint::Scalar Scalar
Alias to scalar type.
typename Base::VectorArray VectorArray
Alias to vector derivatives array.
Algebraic Sphere fitting procedure on oriented point sets.
typename DataPoint::Scalar Scalar
Alias to scalar type.
typename Base::VectorType VectorType
Alias to vector type.
DiffType
Flags defining which derivatives need to be computed.
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.
@ CONFLICT_ERROR_FOUND
Multiple classes of the fitting procedure initialize the primitive.
@ STABLE
The fitting is stable and ready to use.
@ UNSTABLE
The fitting is ready to use but it is considered as unstable (if the number of neighbors is low for e...