diff --git a/src/meshlabplugins/edit_align/align/OccupancyGrid.cpp b/src/meshlabplugins/edit_align/align/OccupancyGrid.cpp index 0f6a62a3c..1de8c548e 100644 --- a/src/meshlabplugins/edit_align/align/OccupancyGrid.cpp +++ b/src/meshlabplugins/edit_align/align/OccupancyGrid.cpp @@ -103,54 +103,57 @@ void OccupancyGrid::AddVert(vector &vv, Matrix44d &Tr, int id) void OccupancyGrid::Compute() { - // Analisi della griglia - // Si deve trovare l'insieme degli archi piu'plausibili - // un arco ha "senso" in una cella se entrambe le mesh compaiono in quell'arco + // Analisi della griglia + // Si deve trovare l'insieme degli archi piu'plausibili + // un arco ha "senso" in una cella se entrambe le mesh compaiono in quell'arco // Si considera tutti gli archi possibili e si conta in quante celle ha senso un arco - VA.clear(); - VA.resize(mn*mn); - + VA.clear(); + VA.resize(mn*mn,0); + vector vv; int i,j,k,ii,jj; - // scan the grid and update possible arc count - for(i=0;i0) + // scan the grid and update possible arc count + for(i=0;i0) { vector::iterator vi; - for(vi=vv.begin();vi!=vv.end();++vi) {// per ogni mesh che passa dalla cella - ++VM[*vi].area; // compute mesh area - if(vv.size()0) - SVA.push_back( OGArcInfo(i,j, VA[i+j*mn], VA[i+j*mn]/float( min(VM[i].area,VM[j].area)) )); + // Find the best arcs + SVA.clear(); + for(i=0;i0) + SVA.push_back( OGArcInfo(i,j, VA[i+j*mn], VA[i+j*mn]/float( min(VM[i].area,VM[j].area)) )); - // Compute Mesh Coverage - for(i=0;i cnt; + std::bitset<_MAX_MCB_SIZE> cnt; public: - static int MaxVal() {return _MAX_MCB_SIZE;} - bool Empty() const {return cnt.none();}; - void Clear() {cnt.reset();} - bool IsSet(int i) const {return cnt[i];} - void Set(int i) {cnt[i]=true;} - void UnSet(int i) {cnt[i]=false;} - int Count() const { return cnt.count();} - void Pack(std::vector &v) const - { - v.clear(); - for(int i=0;i<_MAX_MCB_SIZE;++i) - if(cnt[i]==1) v.push_back(i); - } - void Dump() const - { - for(int i=0;i<64;++i) { - if((i%32)==0) printf(" " ); - if(cnt[i]) printf("1"); else printf("0"); - } - } + static int MaxVal() {return _MAX_MCB_SIZE;} + bool Empty() const {return cnt.none();} + void Clear() {cnt.reset();} + bool IsSet(int i) const {return cnt.test(i);} + void Set(int i) {cnt.set(i);} + void UnSet(int i) {cnt.reset(i);} + int Count() const { return cnt.count();} - bool operator < (const MeshCounterB &c) const { - int ii=0; - if(cnt==c.cnt) return false; - while(ii<_MAX_MCB_SIZE){ - if(cnt[ii]!=c.cnt[ii]) return cnt[ii] ulb(0xffffffff); - unsigned long ul =(ulb & cnt).to_ulong(); - unsigned long ula=(ulb & c.cnt).to_ulong(); - //printf("\n<(%8x-%8x)\n",ul,ula);fflush(stdout); - if(ul!=ula) return ul cc = cnt; - bitset cca = c.cnt; - while (ii>0){ - cc>>=(sizeof(unsigned long)*8); - cca>>=(sizeof(unsigned long)*8); - unsigned long ul=(cc&ulb).to_ulong(); - unsigned long ula=(cca&ulb).to_ulong(); - //printf("\n<(%8x-%8x)\n",ul,ula);fflush(stdout); - if(ul!=ula) return ul &v) const + { + v.clear(); + for(int i=0;i<_MAX_MCB_SIZE;++i) + if(cnt[i]==1) v.push_back(i); + } + + void Dump() const + { + for(int i=0;i<64;++i) { + if((i%32)==0) printf(" " ); + if(cnt[i]) printf("1"); else printf("0"); + } + } + + bool operator < (const MeshCounterB &c) const { + int ii=0; + if(cnt==c.cnt) return false; + while(ii<_MAX_MCB_SIZE){ + if(cnt[ii]!=c.cnt[ii]) return cnt[ii] ulb(0xffffffff); + unsigned long ul =(ulb & cnt).to_ulong(); + unsigned long ula=(ulb & c.cnt).to_ulong(); + //printf("\n<(%8x-%8x)\n",ul,ula);fflush(stdout); + if(ul!=ula) return ul cc = cnt; + bitset cca = c.cnt; + while (ii>0){ + cc>>=(sizeof(unsigned long)*8); + cca>>=(sizeof(unsigned long)*8); + unsigned long ul=(cc&ulb).to_ulong(); + unsigned long ula=(cca&ulb).to_ulong(); + //printf("\n<(%8x-%8x)\n",ul,ula);fflush(stdout); + if(ul!=ula) return ul > &AV, std::vector &BNV,std::vector &adjcnt, float normarea= 0.3); void Compute(); void ComputeUsefulMesh(FILE *elfp=0); @@ -292,10 +292,7 @@ void ChooseArcs(std::vector > &AV, std::vector &BNV,std: void ComputeTotalArea(); void DrawCell(int x,int y, int z); GridStaticObj G; -// map M2I; -// map I2M; std::vector VA; // virtual arcs - //vector MS; // Mesh surface (expressed in voxels) int mn; int TotalArea; int MaxCount; // massimo numero di mesh che passano per una cella;