avoid several implicit conversions, replace several old C-casts with static_cast, do some optimizations

This commit is contained in:
wmayer
2019-09-20 14:56:36 +02:00
parent 81d2ff358d
commit d4d9cd093e
9 changed files with 232 additions and 169 deletions

View File

@@ -29,6 +29,7 @@
#endif
#include "Approximation.h"
#include "Utilities.h"
#include <Base/BoundBox.h>
#include <boost/math/special_functions/fpclassify.hpp>
@@ -56,22 +57,12 @@ Approximation::~Approximation()
Clear();
}
void Approximation::Convert( const Wm4::Vector3<double>& Wm4, Base::Vector3f& pt)
{
pt.Set( (float)Wm4.X(), (float)Wm4.Y(), (float)Wm4.Z() );
}
void Approximation::Convert( const Base::Vector3f& pt, Wm4::Vector3<double>& Wm4)
{
Wm4.X() = pt.x; Wm4.Y() = pt.y; Wm4.Z() = pt.z;
}
void Approximation::GetMgcVectorArray(std::vector< Wm4::Vector3<double> >& rcPts) const
{
std::list< Base::Vector3f >::const_iterator It;
rcPts.reserve(_vPoints.size());
for (It = _vPoints.begin(); It != _vPoints.end(); ++It) {
Wm4::Vector3<double> pt( (*It).x, (*It).y, (*It).z );
rcPts.push_back( pt );
rcPts.push_back(Base::convertTo<Wm4::Vector3d>(*It));
}
}
@@ -81,27 +72,21 @@ void Approximation::AddPoint(const Base::Vector3f &rcVector)
_bIsFitted = false;
}
void Approximation::AddPoints(const std::vector<Base::Vector3f> &rvPointVect)
void Approximation::AddPoints(const std::vector<Base::Vector3f> &points)
{
std::vector<Base::Vector3f>::const_iterator cIt;
for (cIt = rvPointVect.begin(); cIt != rvPointVect.end(); ++cIt)
_vPoints.push_back(*cIt);
std::copy(points.begin(), points.end(), _vPoints.end());
_bIsFitted = false;
}
void Approximation::AddPoints(const std::set<Base::Vector3f> &rsPointSet)
void Approximation::AddPoints(const std::set<Base::Vector3f> &points)
{
std::set<Base::Vector3f>::const_iterator cIt;
for (cIt = rsPointSet.begin(); cIt != rsPointSet.end(); ++cIt)
_vPoints.push_back(*cIt);
std::copy(points.begin(), points.end(), _vPoints.end());
_bIsFitted = false;
}
void Approximation::AddPoints(const std::list<Base::Vector3f> &rsPointList)
void Approximation::AddPoints(const std::list<Base::Vector3f> &points)
{
std::list<Base::Vector3f>::const_iterator cIt;
for (cIt = rsPointList.begin(); cIt != rsPointList.end(); ++cIt)
_vPoints.push_back(*cIt);
std::copy(points.begin(), points.end(), _vPoints.end());
_bIsFitted = false;
}
@@ -158,22 +143,22 @@ float PlaneFit::Fit()
return FLOAT_MAX;
double sxx,sxy,sxz,syy,syz,szz,mx,my,mz;
sxx=sxy=sxz=syy=syz=szz=mx=my=mz=0.0f;
sxx=sxy=sxz=syy=syz=szz=mx=my=mz=0.0;
for (std::list<Base::Vector3f>::iterator it = _vPoints.begin(); it!=_vPoints.end(); ++it) {
sxx += it->x * it->x; sxy += it->x * it->y;
sxz += it->x * it->z; syy += it->y * it->y;
syz += it->y * it->z; szz += it->z * it->z;
mx += it->x; my += it->y; mz += it->z;
sxx += double(it->x * it->x); sxy += double(it->x * it->y);
sxz += double(it->x * it->z); syy += double(it->y * it->y);
syz += double(it->y * it->z); szz += double(it->z * it->z);
mx += double(it->x); my += double(it->y); mz += double(it->z);
}
unsigned int nSize = _vPoints.size();
sxx = sxx - mx*mx/((double)nSize);
sxy = sxy - mx*my/((double)nSize);
sxz = sxz - mx*mz/((double)nSize);
syy = syy - my*my/((double)nSize);
syz = syz - my*mz/((double)nSize);
szz = szz - mz*mz/((double)nSize);
size_t nSize = _vPoints.size();
sxx = sxx - mx*mx/(double(nSize));
sxy = sxy - mx*my/(double(nSize));
sxz = sxz - mx*mz/(double(nSize));
syy = syy - my*my/(double(nSize));
syz = syz - my*mz/(double(nSize));
szz = szz - mz*mz/(double(nSize));
#if defined(FC_USE_EIGEN)
Eigen::Matrix3d covMat = Eigen::Matrix3d::Zero();
@@ -225,11 +210,11 @@ float PlaneFit::Fit()
return FLOAT_MAX;
}
_vDirU.Set((float)U.X(), (float)U.Y(), (float)U.Z());
_vDirV.Set((float)V.X(), (float)V.Y(), (float)V.Z());
_vDirW.Set((float)W.X(), (float)W.Y(), (float)W.Z());
_vBase.Set((float)(mx/nSize), (float)(my/nSize), (float)(mz/nSize));
float sigma = (float)W.Dot(akMat * W);
_vDirU.Set(float(U.X()), float(U.Y()), float(U.Z()));
_vDirV.Set(float(V.X()), float(V.Y()), float(V.Z()));
_vDirW.Set(float(W.X()), float(W.Y()), float(W.Z()));
_vBase.Set(float(mx/nSize), float(my/nSize), float(mz/nSize));
float sigma = float(W.Dot(akMat * W));
#endif
// In case sigma is nan
@@ -309,7 +294,7 @@ float PlaneFit::GetStdDeviation() const
float fSumXi = 0.0f, fSumXi2 = 0.0f,
fMean = 0.0f, fDist = 0.0f;
float ulPtCt = (float)CountPoints();
float ulPtCt = float(CountPoints());
std::list< Base::Vector3f >::const_iterator cIt;
for (cIt = _vPoints.begin(); cIt != _vPoints.end(); ++cIt) {
@@ -319,7 +304,7 @@ float PlaneFit::GetStdDeviation() const
}
fMean = (1.0f / ulPtCt) * fSumXi;
return (float)sqrt((ulPtCt / (ulPtCt - 3.0)) * ((1.0 / ulPtCt) * fSumXi2 - fMean * fMean));
return sqrt((ulPtCt / (ulPtCt - 3.0f)) * ((1.0f / ulPtCt) * fSumXi2 - fMean * fMean));
}
float PlaneFit::GetSignedStdDeviation() const
@@ -335,7 +320,7 @@ float PlaneFit::GetSignedStdDeviation() const
float fMinDist = FLOAT_MAX;
float fFactor;
float ulPtCt = (float)CountPoints();
float ulPtCt = float(CountPoints());
Base::Vector3f clGravity, clPt;
std::list<Base::Vector3f>::const_iterator cIt;
for (cIt = _vPoints.begin(); cIt != _vPoints.end(); ++cIt)
@@ -360,7 +345,7 @@ float PlaneFit::GetSignedStdDeviation() const
fMean = 1.0f / ulPtCt * fSumXi;
return fFactor * (float)sqrt((ulPtCt / (ulPtCt - 3.0)) * ((1.0 / ulPtCt) * fSumXi2 - fMean * fMean));
return fFactor * sqrt((ulPtCt / (ulPtCt - 3.0f)) * ((1.0f / ulPtCt) * fSumXi2 - fMean * fMean));
}
void PlaneFit::ProjectToPlane ()
@@ -397,14 +382,14 @@ std::vector<Base::Vector3f> PlaneFit::GetLocalPoints() const
{
std::vector<Base::Vector3f> localPoints;
if (_bIsFitted && _fLastResult < FLOAT_MAX) {
Base::Vector3d bs(this->_vBase.x,this->_vBase.y,this->_vBase.z);
Base::Vector3d ex(this->_vDirU.x,this->_vDirU.y,this->_vDirU.z);
Base::Vector3d ey(this->_vDirV.x,this->_vDirV.y,this->_vDirV.z);
Base::Vector3d ez(this->_vDirW.x,this->_vDirW.y,this->_vDirW.z);
Base::Vector3d bs = Base::convertTo<Base::Vector3d>(this->_vBase);
Base::Vector3d ex = Base::convertTo<Base::Vector3d>(this->_vDirU);
Base::Vector3d ey = Base::convertTo<Base::Vector3d>(this->_vDirV);
//Base::Vector3d ez = Base::convertTo<Base::Vector3d>(this->_vDirW);
localPoints.insert(localPoints.begin(), _vPoints.begin(), _vPoints.end());
for (std::vector<Base::Vector3f>::iterator it = localPoints.begin(); it != localPoints.end(); ++it) {
Base::Vector3d clPoint(it->x,it->y,it->z);
Base::Vector3d clPoint = Base::convertTo<Base::Vector3d>(*it);
clPoint.TransformToCoordinateSystem(bs, ex, ey);
it->Set(static_cast<float>(clPoint.x), static_cast<float>(clPoint.y), static_cast<float>(clPoint.z));
}
@@ -427,9 +412,9 @@ bool QuadraticFit::GetCurvatureInfo(double x, double y, double z,
FunctionContainer clFuncCont( _fCoeff );
bResult = clFuncCont.CurvatureInfo( x, y, z, rfCurv0, rfCurv1, Dir0, Dir1, dDistance );
dDistance = clFuncCont.GetGradient( x, y, z ).Length();
Convert( Dir0, rkDir0 );
Convert( Dir1, rkDir1 );
dDistance = double(clFuncCont.GetGradient( x, y, z ).Length());
rkDir0 = Base::convertTo<Base::Vector3f>(Dir0);
rkDir1 = Base::convertTo<Base::Vector3f>(Dir1);
}
return bResult;
@@ -459,7 +444,7 @@ double QuadraticFit::GetCoeff(unsigned long ulIndex) const
if( _bIsFitted )
return _fCoeff[ ulIndex ];
else
return FLOAT_MAX;
return double(FLOAT_MAX);
}
float QuadraticFit::Fit()
@@ -504,9 +489,9 @@ void QuadraticFit::CalcEigenValues(double &dLambda1, double &dLambda2, double &d
*
*/
Wm4::Matrix3<double> akMat(_fCoeff[4], _fCoeff[7]/2.0f, _fCoeff[8]/2.0f,
_fCoeff[7]/2.0f, _fCoeff[5], _fCoeff[9]/2.0f,
_fCoeff[8]/2.0f, _fCoeff[9]/2.0f, _fCoeff[6] );
Wm4::Matrix3<double> akMat(_fCoeff[4], _fCoeff[7]/2.0, _fCoeff[8]/2.0,
_fCoeff[7]/2.0, _fCoeff[5], _fCoeff[9]/2.0,
_fCoeff[8]/2.0, _fCoeff[9]/2.0, _fCoeff[6] );
Wm4::Matrix3<double> rkRot, rkDiag;
akMat.EigenDecomposition( rkRot, rkDiag );
@@ -515,9 +500,9 @@ void QuadraticFit::CalcEigenValues(double &dLambda1, double &dLambda2, double &d
Wm4::Vector3<double> vEigenV = rkRot.GetColumn(1);
Wm4::Vector3<double> vEigenW = rkRot.GetColumn(2);
Convert( vEigenU, clEV1 );
Convert( vEigenV, clEV2 );
Convert( vEigenW, clEV3 );
clEV1 = Base::convertTo<Base::Vector3f>(vEigenU);
clEV2 = Base::convertTo<Base::Vector3f>(vEigenV);
clEV3 = Base::convertTo<Base::Vector3f>(vEigenW);
dLambda1 = rkDiag[0][0];
dLambda2 = rkDiag[1][1];
@@ -534,14 +519,14 @@ void QuadraticFit::CalcZValues( double x, double y, double &dZ1, double &dZ2 ) c
4*_fCoeff[6]*_fCoeff[7]*x*y-4*_fCoeff[6]*_fCoeff[4]*x*x-4*_fCoeff[6]*_fCoeff[5]*y*y;
if (fabs( _fCoeff[6] ) < 0.000005) {
dZ1 = FLOAT_MAX;
dZ2 = FLOAT_MAX;
dZ1 = double(FLOAT_MAX);
dZ2 = double(FLOAT_MAX);
return;
}
if (dDisk < 0.0f) {
dZ1 = FLOAT_MAX;
dZ2 = FLOAT_MAX;
if (dDisk < 0.0) {
dZ1 = double(FLOAT_MAX);
dZ2 = double(FLOAT_MAX);
return;
}
else
@@ -556,16 +541,16 @@ void QuadraticFit::CalcZValues( double x, double y, double &dZ1, double &dZ2 ) c
SurfaceFit::SurfaceFit()
: PlaneFit()
{
_fCoeff[0] = 0.0f;
_fCoeff[1] = 0.0f;
_fCoeff[2] = 0.0f;
_fCoeff[3] = 0.0f;
_fCoeff[4] = 0.0f;
_fCoeff[5] = 0.0f;
_fCoeff[6] = 0.0f;
_fCoeff[7] = 0.0f;
_fCoeff[8] = 0.0f;
_fCoeff[9] = 0.0f;
_fCoeff[0] = 0.0;
_fCoeff[1] = 0.0;
_fCoeff[2] = 0.0;
_fCoeff[3] = 0.0;
_fCoeff[4] = 0.0;
_fCoeff[5] = 0.0;
_fCoeff[6] = 0.0;
_fCoeff[7] = 0.0;
_fCoeff[8] = 0.0;
_fCoeff[9] = 0.0;
}
float SurfaceFit::Fit()
@@ -573,7 +558,7 @@ float SurfaceFit::Fit()
float fResult = FLOAT_MAX;
if (CountPoints() > 0) {
fResult = (float) PolynomFit();
fResult = float(PolynomFit());
_fLastResult = fResult;
_bIsFitted = true;
@@ -592,9 +577,9 @@ bool SurfaceFit::GetCurvatureInfo(double x, double y, double z, double &rfCurv0,
FunctionContainer clFuncCont( _fCoeff );
bResult = clFuncCont.CurvatureInfo( x, y, z, rfCurv0, rfCurv1, Dir0, Dir1, dDistance );
dDistance = clFuncCont.GetGradient( x, y, z ).Length();
Convert( Dir0, rkDir0 );
Convert( Dir1, rkDir1 );
dDistance = double(clFuncCont.GetGradient( x, y, z ).Length());
rkDir0 = Base::convertTo<Base::Vector3f>(Dir0);
rkDir1 = Base::convertTo<Base::Vector3f>(Dir1);
}
return bResult;
@@ -615,13 +600,13 @@ bool SurfaceFit::GetCurvatureInfo(double x, double y, double z, double &rfCurv0,
double SurfaceFit::PolynomFit()
{
if (PlaneFit::Fit() == FLOAT_MAX)
return FLOAT_MAX;
if (PlaneFit::Fit() >= FLOAT_MAX)
return double(FLOAT_MAX);
Base::Vector3d bs(this->_vBase.x,this->_vBase.y,this->_vBase.z);
Base::Vector3d ex(this->_vDirU.x,this->_vDirU.y,this->_vDirU.z);
Base::Vector3d ey(this->_vDirV.x,this->_vDirV.y,this->_vDirV.z);
Base::Vector3d ez(this->_vDirW.x,this->_vDirW.y,this->_vDirW.z);
Base::Vector3d bs = Base::convertTo<Base::Vector3d>(this->_vBase);
Base::Vector3d ex = Base::convertTo<Base::Vector3d>(this->_vDirU);
Base::Vector3d ey = Base::convertTo<Base::Vector3d>(this->_vDirV);
//Base::Vector3d ez = Base::convertTo<Base::Vector3d>(this->_vDirW);
// A*x = b
// See also www.cs.jhu.edu/~misha/Fall05/10.23.05.pdf
@@ -648,7 +633,7 @@ double SurfaceFit::PolynomFit()
double dW2 = 0;
for (std::list<Base::Vector3f>::const_iterator it = _vPoints.begin(); it != _vPoints.end(); ++it) {
Base::Vector3d clPoint(it->x,it->y,it->z);
Base::Vector3d clPoint = Base::convertTo<Base::Vector3d>(*it);
clPoint.TransformToCoordinateSystem(bs, ex, ey);
transform.push_back(clPoint);
double dU = clPoint.x;
@@ -772,7 +757,7 @@ double SurfaceFit::PolynomFit()
sigma = sqrt(sigma/_vPoints.size());
_fLastResult = static_cast<float>(sigma);
return _fLastResult;
return double(_fLastResult);
}
double SurfaceFit::Value(double x, double y) const
@@ -862,7 +847,7 @@ float CylinderFit::GetStdDeviation() const
float fSumXi = 0.0f, fSumXi2 = 0.0f,
fMean = 0.0f, fDist = 0.0f;
float ulPtCt = (float)CountPoints();
float ulPtCt = float(CountPoints());
std::list< Base::Vector3f >::const_iterator cIt;
for (cIt = _vPoints.begin(); cIt != _vPoints.end(); ++cIt) {
@@ -872,7 +857,7 @@ float CylinderFit::GetStdDeviation() const
}
fMean = (1.0f / ulPtCt) * fSumXi;
return (float)sqrt((ulPtCt / (ulPtCt - 3.0)) * ((1.0 / ulPtCt) * fSumXi2 - fMean * fMean));
return sqrt((ulPtCt / (ulPtCt - 3.0f)) * ((1.0f / ulPtCt) * fSumXi2 - fMean * fMean));
}
void CylinderFit::ProjectToCylinder()
@@ -894,9 +879,9 @@ void CylinderFit::ProjectToCylinder()
// any direction perpendicular to the cylinder axis
Base::Vector3f cMov(cPnt);
do {
float x = ((float)rand() / (float)RAND_MAX);
float y = ((float)rand() / (float)RAND_MAX);
float z = ((float)rand() / (float)RAND_MAX);
float x = (float(rand()) / float(RAND_MAX));
float y = (float(rand()) / float(RAND_MAX));
float z = (float(rand()) / float(RAND_MAX));
cMov.Move(x,y,z);
}
while (cMov.DistanceToLine(cBase, cAxis) == 0);
@@ -984,7 +969,7 @@ float PolynomialFit::Fit()
}
try {
float* coeff = Wm4::PolyFit3<float>(_vPoints.size(), &(x[0]), &(y[0]), &(z[0]), 2 , 2);
float* coeff = Wm4::PolyFit3<float>(_vPoints.size(), &(x[0]), &(y[0]), &(z[0]), 2, 2);
for (int i=0; i<9; i++)
_fCoeff[i] = coeff[i];
}