3#include "MRPch/MRBindingMacros.h"
40struct PointPair :
public ICPPairData
62 IPointPairs() =
default;
63 IPointPairs(
const IPointPairs& ) =
default;
64 IPointPairs& operator=(
const IPointPairs& ) =
default;
65 IPointPairs( IPointPairs&& ) noexcept = default;
66 IPointPairs& operator=( IPointPairs&& ) noexcept = default;
67 virtual ~IPointPairs() = default;
69 virtual const ICPPairData& operator[](
size_t ) const = 0;
70 virtual ICPPairData& operator[](
size_t ) = 0;
71 virtual
size_t size() const = 0;
75struct PointPairs : public IPointPairs
77 virtual const ICPPairData& operator[](
size_t idx )
const override {
return vec[idx]; }
78 virtual ICPPairData& operator[](
size_t idx )
override {
return vec[idx]; }
79 virtual size_t size()
const override {
return vec.size(); }
80 std::vector<PointPair> vec;
96 [[nodiscard]]
float rootMeanSqF()
const {
return ( num <= 0 ) ? FLT_MAX : (float)std::sqrt( sum / num ); }
118 ICPMode mode,
float angleLimit,
float scaleLimit,
const Vector3f & fixedRotationAxis );
124 ICPMethod method = ICPMethod::PointToPlane;
128 float p2plAngleLimit = PI_F / 6.0f;
132 float p2plScaleLimit = 2;
137 float cosThreshold = 0.7f;
142 float distThresholdSq = 1.f;
148 float farDistFactor = 3.f;
152 ICPMode icpMode = ICPMode::AnyRigidXf;
163 int badIterStopCount = 3;
171 bool mutualClosest =
false;
180 float cosThreshold,
float distThresholdSq,
bool mutualClosest );
185class [[nodiscard]]
ICP
196 const VertBitSet& fltSamples = {},
const VertBitSet& refSamples = {} ) : ICP( { flt, fltXf }, { ref, refXf }, fltSamples, refSamples ) {}
197 MRMESH_API ICP(
const MeshOrPointsXf& flt,
const MeshOrPointsXf& ref,
const VertBitSet& fltSamples = {},
const VertBitSet& refSamples = {} );
205 MRMESH_API ICP(
const MeshOrPoints& flt,
const MeshOrPoints& ref,
const AffineXf3f& fltXf,
const AffineXf3f& refXf,
206 float samplingVoxelSize ) : ICP( { flt, fltXf }, { ref, refXf }, samplingVoxelSize ) {}
207 MRMESH_API ICP(
const MeshOrPointsXf& flt,
const MeshOrPointsXf& ref,
float samplingVoxelSize );
210 void setParams(
const ICPProperties& prop) { prop_ = prop; }
211 MRMESH_API void setCosineLimit(
const float cos);
212 MRMESH_API void setDistanceLimit(
const float dist );
213 MRMESH_API void setBadIterCount(
const int iter );
214 MRMESH_API void setFarDistFactor(
const float factor);
217 MRMESH_API void setFltSamples(
const VertBitSet& fltSamples );
218 MRMESH_API void sampleFltPoints(
float samplingVoxelSize );
221 MRMESH_API void setRefSamples(
const VertBitSet& refSamples );
222 MRMESH_API void sampleRefPoints(
float samplingVoxelSize );
225 void samplePoints(
float samplingVoxelSize ) { sampleFltPoints( samplingVoxelSize ); sampleRefPoints( samplingVoxelSize ); }
227 [[deprecated]] MR_BIND_IGNORE
void recomputeBitSet(
float fltSamplingVoxelSize ) { sampleFltPoints( fltSamplingVoxelSize ); }
230 MRMESH_API void setXfs(
const AffineXf3f& fltXf,
const AffineXf3f& refXf );
233 MRMESH_API void setFloatXf(
const AffineXf3f& fltXf );
243 [[nodiscard]]
const ICPProperties& getParams()
const {
return prop_; }
245 [[nodiscard]]
MRMESH_API std::string getStatusInfo()
const;
260 [[nodiscard]]
const PointPairs & getFlt2RefPairs()
const {
return flt2refPairs_; }
263 [[nodiscard]]
const PointPairs & getRef2FltPairs()
const {
return ref2fltPairs_; }
267 [[nodiscard]]
MRMESH_API AffineXf3f calculateTransformation();
275 PointPairs flt2refPairs_;
276 PointPairs ref2fltPairs_;
278 ICPExitType resultType_{ ICPExitType::NotStarted };
281 void deactivatefarDistPairs_();
287 void calcGen_(
float (ICP::*dist)() const, bool (ICP::*iter)() );
290 void calcCombined_();
constexpr A operator+(A a)
Definition MRImGuiVectorOperators.h:97
#define MRMESH_API
Definition MRMeshFwd.h:80
new unsafe ref MR.Vector3f srcNorm
new unsafe ref MR.Vector3f srcPoint
new unsafe ref MR.Vector3f tgtNorm
new unsafe ref float distSq
new unsafe ref MR.Vector3f tgtPoint
new unsafe ref float weight
Definition MRMeshOrPoints.h:106
Definition MRMeshOrPoints.h:18
new unsafe ref bool tgtOnBd
new unsafe ref float normalsAngleCos
new unsafe ref MR.VertId tgtCloseVert
new unsafe ref MR.VertId srcVertId
Definition MRCameraOrientationPlugin.h:8
MRMESH_API NumSum getSumSqDistToPoint(const IPointPairs &pairs, std::optional< double > inaccuracy={})
float getMeanSqDistToPlane(const IPointPairs &pairs)
computes root-mean-square deviation from points to target planes
Definition MRICP.h:111
MRMESH_API NumSum getSumSqDistToPlane(const IPointPairs &pairs, std::optional< double > inaccuracy={})
MRMESH_API AffineXf3d getAligningXf(const PointToPlaneAligningTransform &p2pl, ICPMode mode, float angleLimit, float scaleLimit, const Vector3f &fixedRotationAxis)
given prepared (p2pl) object, finds the best transformation from it of given type with given limitati...
MRMESH_API size_t getNumActivePairs(const IPointPairs &pairs)
computes the number of active pairs
size_t getNumSamples(const IPointPairs &pairs)
returns the number of samples able to form pairs
Definition MRICP.h:84
MRMESH_API std::string getICPStatusInfo(int iterations, ICPExitType exitType)
returns status info string
float getMeanSqDistToPoint(const IPointPairs &pairs)
computes root-mean-square deviation between points
Definition MRICP.h:108
MRMESH_API void updatePointPairs(PointPairs &pairs, const MeshOrPointsXf &src, const MeshOrPointsXf &tgt, float cosThreshold, float distThresholdSq, bool mutualClosest)
in each pair updates the target data and performs basic filtering (activation)
MRMESH_API size_t deactivateFarPairs(IPointPairs &pairs, float maxDistSq)
reset active bit if pair distance is further than maxDistSq
float getMeanSqDistToPlane(IPointPairs pairs)
None updatePointPairs(PointPairs pairs, MeshOrPointsXf src, MeshOrPointsXf tgt, float cosThreshold, float distThresholdSq, bool mutualClosest)
float getMeanSqDistToPoint(IPointPairs pairs)
int getNumSamples(IPointPairs pairs)
int getNumActivePairs(IPointPairs pairs)