1 #include "ocme_definition.h"
2 #include "impostor_definition.h"
3
Verify()4 void OCME::Verify(){
5
6 /* */
7 CellsIterator ci;
8
9 {
10 lgn->Append("CHECK IF: ecd/rd exists for each cell");lgn->Push();
11 for(ci = cells.begin(); ci != cells.end(); ++ci){
12 RAssert( (*ci).second->ecd);
13 RAssert( (*ci).second->rd);
14 }
15 }
16
17 {
18 lgn->Append("CHECK IF: load/unload work");lgn->Push();
19 for(ci = cells.begin(); ci != cells.end(); ++ci){
20 Chain<OVertex> * vert = (*ci).second->vert;
21 Chain<OFace> * face = (*ci).second->face;
22 vert->LoadAll();
23 face->LoadAll();
24 vert->FreeAll();
25 face->FreeAll();
26 }
27 }
28
29 {
30 lgn->Append("CHECK IF: faces point to vertex inside the cells");lgn->Push();
31 for(ci = cells.begin(); ci != cells.end(); ++ci){
32 Chain<OVertex> * vert = (*ci).second->vert;
33 Chain<OFace> * face = (*ci).second->face;
34
35 for(unsigned int fi = 0 ; fi < face->Size();++fi)
36 for(unsigned int vi = 0 ; vi <3;++vi)
37 RAssert((*face)[fi][vi] < vert->Size());
38 }
39 }
40
41 {
42 lgn->Append("CHECK IF: dependent cells exist and dependence is symmetric");lgn->Push();
43 std::set<CellKey>::iterator cki;
44 for(ci = cells.begin(); ci != cells.end(); ++ci)
45 for(cki = (*ci).second->dependence_set.begin(); cki != (*ci).second->dependence_set.end(); ++cki)
46 {
47 Cell * c = GetCell((*cki),false);
48 if(!c){
49 sprintf(lgn->Buf(),"%d %d %d %d does not exist",(*cki).x,(*cki).y,(*cki).z,(*cki).h);
50 lgn->Push();
51 }else
52 {
53 if(c->dependence_set.find((*ci).second->key)== c->dependence_set.end())
54 sprintf(lgn->Buf(),"%d %d %d %d Asymmetric",(*cki).x,(*cki).y,(*cki).z,(*cki).h);
55 }
56
57
58 }
59 }
60
61 {
62 lgn->Append("CHECK IF: pointers to boundary (uniquely) refer to existing vertices");lgn->Push();
63 std::set<CellKey>::iterator cki;
64 for(ci = cells.begin(); ci != cells.end(); ++ci){
65 std::set<unsigned int> bv;
66 Chain<OVertex> * vert = (*ci).second->vert;
67 Chain<BorderIndex > * border = (*ci).second->border;
68 for(unsigned int bi = 0 ; bi < border->Size();++bi)
69 {
70 if((*border)[bi].vi > vert->Size()){
71 sprintf(lgn->Buf(),"(vi,bi)= (%d,%d) , vs = %d",(*border)[bi].vi,(*border)[bi].bi,vert->Size());
72 lgn->Push();
73 }
74
75 std::pair<std::set<unsigned int>::iterator, bool > res = bv.insert((*border)[bi].vi);
76
77 if(!res.second){
78 Cell * c = (*ci).second;
79 sprintf(lgn->Buf(),"%d %d %d %d :: ii %d, vi %d , bv.size() %d",
80 c->key.x,c->key.y,c->key.z,c->key.h,
81 bi,(*border)[bi].vi,bv.size());
82 lgn->Push();
83
84 }
85 }
86 }
87 }
88
89
90 }
91
ComputeStatistics()92 void OCME::ComputeStatistics(){
93 lgn->off = false;
94
95 std::vector<unsigned int> distr,distrD;
96 unsigned int max_tri = 0;
97 unsigned int max_dep = 0;
98 CellsIterator ci;
99 stat = Statistics();
100 unsigned int com =0;
101 {
102 stat.n_cells = cells.size();
103
104 for(ci = cells.begin(); ci != cells.end(); ++ci){
105 distr.push_back( ((*ci).second->face->Size()));
106 distrD.push_back( (*ci).second->dependence_set.size());
107 if (max_tri< (*ci).second->face->Size()) max_tri = (*ci).second->face->Size();
108 if (max_dep< (*ci).second->dependence_set.size()) max_dep = (*ci).second->dependence_set.size();
109
110 stat.n_triangles += (*ci).second->face->Size();
111 stat.n_vertices += (*ci).second->vert->Size();
112 stat.n_proxies += (*ci).second->impostor->centroids.data.size();
113 com += (*ci).second->impostor->positionsV.size();
114 }
115 }
116
117 sprintf(lgn->Buf(),"n_cells %d, n_tri %d, n_vert %d, n_pro(compact) %d,n_pro(sparse) %d",
118 stat.n_cells,stat.n_triangles,stat.n_vertices,com,stat.n_proxies
119 );
120 lgn->Push();
121 {
122 std::sort(distr.begin(),distr.end());
123
124 unsigned int j =0;
125 for(unsigned int i = 1; i < 100;++i){
126 unsigned int h = 0;
127 while(distr[j]< max_tri*i/100.f){++j;++h;}
128 sprintf(lgn->Buf(),"%f, %d",max_tri*i/100.f,h);
129 lgn->Push();
130 }
131 }
132 sprintf(lgn->Buf(),"-------------------------------------");lgn->Push();
133 {
134 std::sort(distrD.begin(),distrD.end());
135
136 unsigned int j =0;
137 for(unsigned int i = 1; i < 20;++i){
138 unsigned int h = 0;
139 while(distrD[j]< max_dep*i/20.f){++j;++h;}
140 sprintf(lgn->Buf(),"%f, %d",max_dep*i/20.f,h);
141 lgn->Push();
142 }
143 }
144 }
145
CheckFaceVertDeletions(Cell * c)146 bool OCME::CheckFaceVertDeletions(Cell *c){ return true;
147
148 c->ecd->deleted_face.SetAsVectorOfBool();
149 c->ecd->deleted_vertex.SetAsVectorOfBool();
150 for(unsigned int fi = 0; fi < c->face->Size(); ++fi)
151 if(!c->ecd->deleted_face.IsMarked(fi))
152 {
153 OFace of = (*(c->face))[fi];
154 for(unsigned int vpi = 0; vpi < 3; ++vpi)
155 RAssert(!c->ecd->deleted_vertex.IsMarked(of[vpi]));
156 }
157 return true;
158 }
159
CheckFaceVertexAdj(Cell * c)160 bool OCME::CheckFaceVertexAdj(Cell *c){
161 for(unsigned int fi = 0; fi < c->face->Size(); ++fi){
162
163 OFace of = (*(c->face))[fi];
164
165 for(unsigned int vpi = 0; vpi < 3; ++vpi){
166 if( (*(c->vert)).Size() <= of[vpi])
167 {
168 sprintf(lgn->Buf(),"wrong face-vert adj cell: %d %d %d %d", c->key);lgn->Push();
169 sprintf(lgn->Buf(),"wrong face-vert adj face: %d", fi);lgn->Push();
170 sprintf(lgn->Buf(),"wrong face-vert adj ov[]: %d %d %d ",of[0],of[1],of[2]);lgn->Push();
171
172
173 return false;}
174 // if( 0 > of[vpi] )
175 // { lgn->Append("negative face-vert adj ");lgn->Push(); return false;}
176 }
177 }
178 return true;
179 }
180
CheckDependentSet(std::vector<Cell * > &)181 bool OCME:: CheckDependentSet(std::vector<Cell*> & ){return true;
182
183 }
184
BorderExists(Cell * c,unsigned int vi)185 bool OCME:: BorderExists(Cell* c,unsigned int vi){
186 for(unsigned int vii = 0; vii < c->border->Size(); ++vii)
187 if((*c->border)[vii].vi == vi)
188 return true;
189 return false;
190 }
191