mirror of
https://github.com/lucaspalomodevelop/meshlab.git
synced 2026-03-20 03:16:10 +00:00
Changed the base class in the occupancy grid for counting the mesh passing in a cell. Now it uses a bitset instead of a vector
This commit is contained in:
parent
b2ab77cbf3
commit
541891c1ad
@ -103,54 +103,57 @@ void OccupancyGrid::AddVert(vector<Point3f> &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<int > vv;
|
||||
int i,j,k,ii,jj;
|
||||
// scan the grid and update possible arc count
|
||||
for(i=0;i<G.siz[0];++i)
|
||||
for(j=0;j<G.siz[1];++j)
|
||||
for(k=0;k<G.siz[2];++k)
|
||||
{
|
||||
G.Grid(i,j,k).Pack(vv);
|
||||
if(vv.size()>0)
|
||||
// scan the grid and update possible arc count
|
||||
for(i=0;i<G.siz[0];++i)
|
||||
for(j=0;j<G.siz[1];++j)
|
||||
for(k=0;k<G.siz[2];++k)
|
||||
{
|
||||
G.Grid(i,j,k).Pack(vv);
|
||||
if(vv.size()>0)
|
||||
{
|
||||
vector<int>::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()<OGMeshInfo::MaxStat())
|
||||
++VM[*vi].unique[vv.size()];
|
||||
}
|
||||
for(vi=vv.begin();vi!=vv.end();++vi)
|
||||
{
|
||||
++VM[*vi].area; // compute mesh area
|
||||
if(vv.size()<OGMeshInfo::MaxStat())
|
||||
++VM[*vi].unique[vv.size()];
|
||||
}
|
||||
|
||||
for(ii=0;ii<vv.size()-1;++ii)
|
||||
for(jj=1;jj<vv.size();++jj)
|
||||
++VA[vv[ii]+vv[jj]*mn]; // count intersections of all mesh pairs
|
||||
}
|
||||
}
|
||||
for(ii=0;ii<vv.size()-1;++ii)
|
||||
for(jj=1;jj<vv.size();++jj)
|
||||
++VA[vv[ii]+vv[jj]*mn]; // count intersections of all mesh pairs
|
||||
}
|
||||
}
|
||||
|
||||
// Find the best arcs
|
||||
SVA.clear();
|
||||
for(i=0;i<mn-1;++i)
|
||||
if(VM[i].used)
|
||||
for(j=i+1;j<mn;++j)
|
||||
if(VM[j].used && VA[i+j*mn]>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;i<mn-1;++i)
|
||||
if(VM[i].used)
|
||||
for(j=i+1;j<mn;++j)
|
||||
if(VM[j].used && VA[i+j*mn]>0)
|
||||
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<SVA.size();++i)
|
||||
{
|
||||
VM[SVA[i].s].coverage += SVA[i].area;
|
||||
VM[SVA[i].t].coverage += SVA[i].area;
|
||||
}
|
||||
|
||||
sort(SVA.begin(),SVA.end());
|
||||
reverse(SVA.begin(),SVA.end());
|
||||
// Compute Mesh Coverage
|
||||
for(i=0;i<SVA.size();++i)
|
||||
{
|
||||
VM[SVA[i].s].coverage += SVA[i].area;
|
||||
VM[SVA[i].t].coverage += SVA[i].area;
|
||||
}
|
||||
|
||||
sort(SVA.begin(),SVA.end());
|
||||
reverse(SVA.begin(),SVA.end());
|
||||
}
|
||||
|
||||
|
||||
void OccupancyGrid::ComputeTotalArea()
|
||||
{
|
||||
int ccnt=0;
|
||||
|
||||
@ -128,85 +128,86 @@ public:
|
||||
};
|
||||
|
||||
#define _MAX_MCB_SIZE 1024
|
||||
// Tiene per ogni voxel quali mesh ci passano.
|
||||
// Notare che:
|
||||
// il massimo numero di mesh e' MAXMESH
|
||||
|
||||
// Class to keep for each voxel the id of the mesh passing throuhg it.
|
||||
class MeshCounterB
|
||||
{
|
||||
std::bitset<_MAX_MCB_SIZE> 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<int> &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]<c.cnt[ii];
|
||||
++ii;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
/*
|
||||
bool operator < (const MeshCounter &c) const {
|
||||
bitset<MAXMESH> 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<ula;
|
||||
if(cnt==c.cnt) return false;
|
||||
//printf("\nComparing: "); Dump();
|
||||
//printf("\n "); c.Dump();
|
||||
int ii=MAXMESH/(sizeof(unsigned long)*8)-1;
|
||||
bitset<MAXMESH> cc = cnt;
|
||||
bitset<MAXMESH> 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<ula;
|
||||
--ii;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
*/
|
||||
// Return a vector with all the id of the meshes
|
||||
void Pack(std::vector<int> &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]<c.cnt[ii];
|
||||
++ii;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
/*
|
||||
bool operator < (const MeshCounter &c) const {
|
||||
bitset<MAXMESH> 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<ula;
|
||||
if(cnt==c.cnt) return false;
|
||||
//printf("\nComparing: "); Dump();
|
||||
//printf("\n "); c.Dump();
|
||||
int ii=MAXMESH/(sizeof(unsigned long)*8)-1;
|
||||
bitset<MAXMESH> cc = cnt;
|
||||
bitset<MAXMESH> 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<ula;
|
||||
--ii;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
*/
|
||||
};
|
||||
|
||||
|
||||
/***********************************************************/
|
||||
typedef MeshCounterV MeshCounter; // per usare i vettori compattati
|
||||
//typedef MeshCounterB MeshCounter; // per usare i bitset
|
||||
//typedef MeshCounterV MeshCounter; // per usare i vettori compattati
|
||||
typedef MeshCounterB MeshCounter; // per usare i bitset
|
||||
/***********************************************************/
|
||||
|
||||
class OGUseInfo
|
||||
{
|
||||
public:
|
||||
OGUseInfo() {id=-1; area=0;}
|
||||
OGUseInfo(const int _id, const int _area) :id(_id),area(_area){}
|
||||
int id;
|
||||
int area;
|
||||
bool operator < (const OGUseInfo &o) const { return area<o.area;}
|
||||
|
||||
OGUseInfo() {id=-1; area=0;}
|
||||
OGUseInfo(const int _id, const int _area) :id(_id),area(_area){}
|
||||
int id;
|
||||
int area;
|
||||
bool operator < (const OGUseInfo &o) const { return area<o.area;}
|
||||
};
|
||||
|
||||
class OGMeshInfo
|
||||
@ -281,7 +282,6 @@ void AddMesh(MESH &M, const Matrix44d &Tr, int ind)
|
||||
}
|
||||
|
||||
|
||||
// void Add(A2Mesh &m, Matrix44d &Tr, int id);
|
||||
void ChooseArcs(std::vector<std::pair<int,int> > &AV, std::vector<int> &BNV,std::vector<int> &adjcnt, float normarea= 0.3);
|
||||
void Compute();
|
||||
void ComputeUsefulMesh(FILE *elfp=0);
|
||||
@ -292,10 +292,7 @@ void ChooseArcs(std::vector<std::pair<int,int> > &AV, std::vector<int> &BNV,std:
|
||||
void ComputeTotalArea();
|
||||
void DrawCell(int x,int y, int z);
|
||||
GridStaticObj<MeshCounter, float> G;
|
||||
// map<AMesh *,int> M2I;
|
||||
// map<int,AMesh *> I2M;
|
||||
std::vector<int> VA; // virtual arcs
|
||||
//vector<int> MS; // Mesh surface (expressed in voxels)
|
||||
int mn;
|
||||
int TotalArea;
|
||||
int MaxCount; // massimo numero di mesh che passano per una cella;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user