Updated 4pcs to float/double independnece

This commit is contained in:
Paolo Cignoni 2014-08-26 08:45:04 +00:00
parent 8e9de883b3
commit 60ca2f2d72
1 changed files with 18 additions and 15 deletions

View File

@ -49,12 +49,15 @@ public:
class PUsedTypes: public vcg::UsedTypes < vcg::Use<PVertex>::template AsVertexType, class PUsedTypes: public vcg::UsedTypes < vcg::Use<PVertex>::template AsVertexType,
vcg::Use<PFace >::template AsFaceType >{}; vcg::Use<PFace >::template AsFaceType >{};
class PVertex : public vcg::Vertex< PUsedTypes,vcg::vertex::BitFlags,vcg::vertex::Coord3f ,vcg::vertex::Mark>{}; class PVertex : public vcg::Vertex< PUsedTypes,vcg::vertex::BitFlags,vcg::vertex::Coord3d ,vcg::vertex::Mark>{};
class PFace : public vcg::Face< PUsedTypes> {}; class PFace : public vcg::Face< PUsedTypes> {};
class PMesh : public vcg::tri::TriMesh< std::vector<PVertex>, std::vector<PFace> > {}; class PMesh : public vcg::tri::TriMesh< std::vector<PVertex>, std::vector<PFace> > {};
typedef typename MeshType::ScalarType ScalarType; typedef typename MeshType::ScalarType ScalarType;
typedef typename MeshType::CoordType CoordType; typedef typename MeshType::CoordType CoordType;
typedef typename vcg::Matrix44<ScalarType> Matrix44x;
typedef typename vcg::Box3<ScalarType> Box3x;
typedef typename MeshType::VertexIterator VertexIterator; typedef typename MeshType::VertexIterator VertexIterator;
typedef typename MeshType::VertexPointer VertexPointer; typedef typename MeshType::VertexPointer VertexPointer;
typedef typename MeshType::VertexType VertexType; typedef typename MeshType::VertexType VertexType;
@ -110,7 +113,7 @@ public:
VertexPointer p0,p1; VertexPointer p0,p1;
Couple(VertexPointer i, VertexPointer j, float d) : p0(i),p1(j),dist(d){} Couple(VertexPointer i, VertexPointer j, float d) : p0(i),p1(j),dist(d){}
float dist; float dist;
const bool operator < (const Couple & o) const {return dist < o.dist;} bool operator < (const Couple & o) const {return dist < o.dist;}
VertexPointer operator[](const int &i) const {return (i==0)? this->p0 : this->p1;} VertexPointer operator[](const int &i) const {return (i==0)? this->p0 : this->p1;}
}; };
@ -200,7 +203,7 @@ bool SelectCoplanarBase(FourPoints &B, ScalarType &r1, ScalarType &r2)
B[0] = P->vert[ rnd.generate(P->vert.size())].P(); B[0] = P->vert[ rnd.generate(P->vert.size())].P();
// **** second point: a random point at distance side +-dtol // **** second point: a random point at distance side +-dtol
int i; size_t i;
for(i = 0; i < P->vert.size(); ++i){ for(i = 0; i < P->vert.size(); ++i){
int id = rnd.generate(P->vert.size()); int id = rnd.generate(P->vert.size());
ScalarType dd = (P->vert[id].P() - B[0]).Norm(); ScalarType dd = (P->vert[id].P() - B[0]).Norm();
@ -212,7 +215,7 @@ bool SelectCoplanarBase(FourPoints &B, ScalarType &r1, ScalarType &r2)
if(i == P->vert.size()) return false; if(i == P->vert.size()) return false;
// **** third point: at distance less than side*0.8 from middle way between B[0] and B[1] // **** third point: at distance less than side*0.8 from middle way between B[0] and B[1]
const vcg::Point3f middle = (B[0]+B[1])/2.0; const CoordType middle = (B[0]+B[1])/2.0;
for(i = 0; i < P->vert.size(); ++i){ for(i = 0; i < P->vert.size(); ++i){
int id = rnd.generate(P->vert.size()); int id = rnd.generate(P->vert.size());
if( Distance(P->vert[id].P(),middle) < side*0.8 ){ if( Distance(P->vert[id].P(),middle) < side*0.8 ){
@ -223,8 +226,8 @@ bool SelectCoplanarBase(FourPoints &B, ScalarType &r1, ScalarType &r2)
if(i == P->vert.size()) return false; if(i == P->vert.size()) return false;
// **** fourth point: // **** fourth point:
float cpr = rnd.generate01(); ScalarType cpr = rnd.generate01();
vcg::Point3f crossP = B[0] *(1-cpr)+B[1]*cpr; CoordType crossP = B[0] *(1-cpr)+B[1]*cpr;
CoordType B4 = B[2]+(crossP-B[2]).Normalize()*side; CoordType B4 = B[2]+(crossP-B[2]).Normalize()*side;
CoordType n = ((B[0]-B[1]).normalized() ^ (B[2]-B[1]).normalized()).normalized(); CoordType n = ((B[0]-B[1]).normalized() ^ (B[2]-B[1]).normalized()).normalized();
ScalarType radius = dtol; ScalarType radius = dtol;
@ -315,8 +318,8 @@ bool IsTransfCongruent(const FourPoints &B, const FourPoints &fp, vcg::Matrix44<
void ComputeR1(std::vector<Couple > &R1) void ComputeR1(std::vector<Couple > &R1)
{ {
R1.clear(); R1.clear();
for(int vi = 0; vi < subsetQ.size(); ++vi) for(size_t vi = 0; vi < subsetQ.size(); ++vi)
for(int vj = vi; vj < subsetQ.size(); ++vj){ for(size_t vj = vi; vj < subsetQ.size(); ++vj){
ScalarType d = Distance(subsetQ[vi]->P(),subsetQ[vj]->P()); ScalarType d = Distance(subsetQ[vi]->P(),subsetQ[vj]->P());
if( (d < side+par.deltaAbs)) if( (d < side+par.deltaAbs))
{ {
@ -360,7 +363,7 @@ bool FindCongruent(const std::vector<Couple > &R1, const FourPoints &B, const Sc
for(ite = bR1; ite != eR1;++ite){ for(ite = bR1; ite != eR1;++ite){
vii = vcg::tri::Allocator<PMesh>::AddVertices(Invr,1); vii = vcg::tri::Allocator<PMesh>::AddVertices(Invr,1);
// (*vii).P() = Q->vert[R1[i][0]].P() + (Q->vert[R1[i][1]].P()-Q->vert[R1[i][0]].P()) * r1; // (*vii).P() = Q->vert[R1[i][0]].P() + (Q->vert[R1[i][1]].P()-Q->vert[R1[i][0]].P()) * r1;
(*vii).P() = ite->p0->P() + ( ite->p1->P() - ite->p0->P()) * r1; (*vii).P() .Import( ite->p0->P() + ( ite->p1->P() - ite->p0->P()) * r1);
++i; ++i;
} }
if(Invr.vert.empty() ) return false; if(Invr.vert.empty() ) return false;
@ -392,9 +395,9 @@ bool FindCongruent(const std::vector<Couple > &R1, const FourPoints &B, const Sc
// for each point in R2inv get all the points in R1 closer than par.delta // for each point in R2inv get all the points in R1 closer than par.delta
vcg::Matrix44<ScalarType> mat; vcg::Matrix44<ScalarType> mat;
vcg::Box3f bb; Box3x bb;
bb.Add(R2inv[i].pos+vcg::Point3f(par.deltaAbs,par.deltaAbs, par.deltaAbs)); bb.Add(R2inv[i].pos+CoordType(par.deltaAbs,par.deltaAbs, par.deltaAbs));
bb.Add(R2inv[i].pos-vcg::Point3f(par.deltaAbs,par.deltaAbs, par.deltaAbs)); bb.Add(R2inv[i].pos-CoordType(par.deltaAbs,par.deltaAbs, par.deltaAbs));
vcg::tri::GetInBoxVertex<PMesh,GridType,std::vector<typename PMesh::VertexType*> > vcg::tri::GetInBoxVertex<PMesh,GridType,std::vector<typename PMesh::VertexType*> >
(Invr,ugrid,bb,closests); (Invr,ugrid,bb,closests);
@ -477,7 +480,7 @@ void TestAlignment(Candidate & fp)
} }
bool Align(vcg::Matrix44f & result, vcg::CallBackPos * cb ) bool Align(Matrix44x & result, vcg::CallBackPos * cb )
{ {
int maxAttempt =100; int maxAttempt =100;
int scoreThr = par.sampleNumP*0.8; int scoreThr = par.sampleNumP*0.8;
@ -495,7 +498,7 @@ bool Align(vcg::Matrix44f & result, vcg::CallBackPos * cb )
U.clear(); U.clear();
FindCongruent(R1,B,r1,r2); FindCongruent(R1,B,r1,r2);
qDebug("Attempt %i found %i candidate best score %i",i,U.size(),bestC.score); qDebug("Attempt %i found %i candidate best score %i",i,U.size(),bestC.score);
for(int i = 0 ; i < U.size() ;++i) for(size_t i = 0 ; i < U.size() ;++i)
{ {
TestAlignment(U[i]); TestAlignment(U[i]);
if(U[i].score > bestC.score) if(U[i].score > bestC.score)
@ -507,7 +510,7 @@ bool Align(vcg::Matrix44f & result, vcg::CallBackPos * cb )
return bestC.score >0; return bestC.score >0;
} }
bool Align(int L, vcg::Matrix44f & result, vcg::CallBackPos * cb ) bool Align(int L, Matrix44x & result, vcg::CallBackPos * cb )
{ {
int bestv = 0; int bestv = 0;
bool found; bool found;