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:
Paolo Cignoni cignoni 2013-02-26 22:07:34 +00:00
parent b2ab77cbf3
commit 541891c1ad
2 changed files with 109 additions and 109 deletions

View File

@ -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;

View File

@ -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;