00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef __VCG_TRI_UPDATE_SELECTION
00024 #define __VCG_TRI_UPDATE_SELECTION
00025
00026 #include <queue>
00027 #include <vcg/complex/trimesh/update/flag.h>
00028
00029 namespace vcg {
00030 namespace tri {
00031
00033
00035
00037
00041 template <class ComputeMeshType>
00042 class UpdateSelection
00043 {
00044
00045 public:
00046 typedef ComputeMeshType MeshType;
00047 typedef typename MeshType::ScalarType ScalarType;
00048 typedef typename MeshType::VertexType VertexType;
00049 typedef typename MeshType::VertexPointer VertexPointer;
00050 typedef typename MeshType::VertexIterator VertexIterator;
00051 typedef typename MeshType::FaceType FaceType;
00052 typedef typename MeshType::FacePointer FacePointer;
00053 typedef typename MeshType::FaceIterator FaceIterator;
00054 typedef typename vcg::Box3<ScalarType> Box3Type;
00055
00056 static size_t AllVertex(MeshType &m)
00057 {
00058 VertexIterator vi;
00059 for(vi = m.vert.begin(); vi != m.vert.end(); ++vi)
00060 if( !(*vi).IsD() ) (*vi).SetS();
00061 return m.vn;
00062 }
00063
00064 static size_t AllFace(MeshType &m)
00065 {
00066 FaceIterator fi;
00067 for(fi = m.face.begin(); fi != m.face.end(); ++fi)
00068 if( !(*fi).IsD() ) (*fi).SetS();
00069 return m.fn;
00070 }
00071
00072 static size_t ClearVertex(MeshType &m)
00073 {
00074 VertexIterator vi;
00075 for(vi = m.vert.begin(); vi != m.vert.end(); ++vi)
00076 if( !(*vi).IsD() ) (*vi).ClearS();
00077 return 0;
00078 }
00079
00080 static size_t ClearFace(MeshType &m)
00081 {
00082 FaceIterator fi;
00083 for(fi = m.face.begin(); fi != m.face.end(); ++fi)
00084 if( !(*fi).IsD() ) (*fi).ClearS();
00085 return 0;
00086 }
00087
00088 static void Clear(MeshType &m)
00089 {
00090 ClearVertex(m);
00091 ClearFace(m);
00092 }
00093
00094 static size_t CountFace(MeshType &m)
00095 {
00096 size_t selCnt=0;
00097 FaceIterator fi;
00098 for(fi=m.face.begin();fi!=m.face.end();++fi)
00099 if(!(*fi).IsD() && (*fi).IsS()) ++selCnt;
00100 return selCnt;
00101 }
00102
00103 static size_t CountVertex(MeshType &m)
00104 {
00105 size_t selCnt=0;
00106 VertexIterator vi;
00107 for(vi=m.vert.begin();vi!=m.vert.end();++vi)
00108 if(!(*vi).IsD() && (*vi).IsS()) ++selCnt;
00109 return selCnt;
00110 }
00111
00112 static size_t InvertFace(MeshType &m)
00113 {
00114 size_t selCnt=0;
00115 FaceIterator fi;
00116 for(fi=m.face.begin();fi!=m.face.end();++fi)
00117 if(!(*fi).IsD())
00118 {
00119 if((*fi).IsS()) (*fi).ClearS();
00120 else {
00121 (*fi).SetS();
00122 ++selCnt;
00123 }
00124 }
00125 return selCnt;
00126 }
00127
00128 static size_t InvertVertex(MeshType &m)
00129 {
00130 size_t selCnt=0;
00131 VertexIterator vi;
00132 for(vi=m.vert.begin();vi!=m.vert.end();++vi)
00133 if(!(*vi).IsD())
00134 {
00135 if((*vi).IsS()) (*vi).ClearS();
00136 else {
00137 (*vi).SetS();
00138 ++selCnt;
00139 }
00140 }
00141 return selCnt;
00142 }
00143
00145 static size_t VertexFromFaceLoose(MeshType &m)
00146 {
00147 size_t selCnt=0;
00148 ClearVertex(m);
00149 FaceIterator fi;
00150 for(fi = m.face.begin(); fi != m.face.end(); ++fi)
00151 if( !(*fi).IsD() && (*fi).IsS())
00152 {
00153 if( !(*fi).V(0)->IsS()) { (*fi).V(0)->SetS(); ++selCnt; }
00154 if( !(*fi).V(1)->IsS()) { (*fi).V(1)->SetS(); ++selCnt; }
00155 if( !(*fi).V(2)->IsS()) { (*fi).V(2)->SetS(); ++selCnt; }
00156 }
00157 return selCnt;
00158 }
00159
00161
00164 static size_t VertexFromFaceStrict(MeshType &m)
00165 {
00166 VertexFromFaceLoose(m);
00167 FaceIterator fi;
00168 for(fi = m.face.begin(); fi != m.face.end(); ++fi)
00169 if( !(*fi).IsD() && !(*fi).IsS())
00170 {
00171 (*fi).V(0)->ClearS();
00172 (*fi).V(1)->ClearS();
00173 (*fi).V(2)->ClearS();
00174 }
00175 return CountVertex(m);
00176 }
00177
00179 static size_t FaceFromVertexStrict(MeshType &m)
00180 {
00181 size_t selCnt=0;
00182 ClearFace(m);
00183 FaceIterator fi;
00184 for(fi = m.face.begin(); fi != m.face.end(); ++fi)
00185 if( !(*fi).IsD())
00186 {
00187 if((*fi).V(0)->IsS() && (*fi).V(1)->IsS() && (*fi).V(2)->IsS())
00188 {
00189 (*fi).SetS();
00190 ++selCnt;
00191 }
00192 }
00193 return selCnt;
00194 }
00195
00196 static size_t FaceFromVertexLoose(MeshType &m)
00197 {
00198 size_t selCnt=0;
00199 ClearFace(m);
00200 FaceIterator fi;
00201 for(fi = m.face.begin(); fi != m.face.end(); ++fi)
00202 if( !(*fi).IsD() && !(*fi).IsS())
00203 {
00204 if((*fi).V(0)->IsS() || (*fi).V(1)->IsS() || (*fi).V(2)->IsS())
00205 {
00206 (*fi).SetS();
00207 ++selCnt;
00208 }
00209 }
00210 return selCnt;
00211 }
00212
00213 static size_t VertexFromBorderFlag(MeshType &m)
00214 {
00215 size_t selCnt=0;
00216 ClearVertex(m);
00217 VertexIterator vi;
00218 for(vi = m.vert.begin(); vi != m.vert.end(); ++vi)
00219 if( !(*vi).IsD() )
00220 {
00221 if((*vi).IsB() )
00222 {
00223 (*vi).SetS();
00224 ++selCnt;
00225 }
00226 }
00227 return selCnt;
00228 }
00229
00230
00231 static size_t FaceFromBorderFlag(MeshType &m)
00232 {
00233 size_t selCnt=0;
00234 ClearFace(m);
00235 FaceIterator fi;
00236 for(fi = m.face.begin(); fi != m.face.end(); ++fi)
00237 if( !(*fi).IsD() )
00238 {
00239 if((*fi).IsB(0) || (*fi).IsB(1) || (*fi).IsB(2))
00240 {
00241 (*fi).SetS();
00242 ++selCnt;
00243 }
00244 }
00245 return selCnt;
00246 }
00247
00249 static size_t FaceOutOfRangeEdge(MeshType &m, ScalarType MinEdgeThr=0, ScalarType MaxEdgeThr=(std::numeric_limits<ScalarType>::max)())
00250 {
00251 FaceIterator fi;
00252 size_t count_fd = 0;
00253 MinEdgeThr=MinEdgeThr*MinEdgeThr;
00254 MaxEdgeThr=MaxEdgeThr*MaxEdgeThr;
00255 for(fi=m.face.begin(); fi!=m.face.end();++fi)
00256 if(!(*fi).IsD())
00257 {
00258 for(unsigned int i=0;i<3;++i)
00259 {
00260 const ScalarType squaredEdge=SquaredDistance((*fi).V0(i)->cP(),(*fi).V1(i)->cP());
00261 if((squaredEdge<=MinEdgeThr) || (squaredEdge>=MaxEdgeThr) )
00262 {
00263 count_fd++;
00264 (*fi).SetS();
00265 break;
00266 }
00267 }
00268 }
00269 return count_fd;
00270 }
00271
00273 static size_t FaceConnectedFF(MeshType &m)
00274 {
00275
00276 assert (HasFFAdjacency(m));
00277 UpdateFlags<MeshType>::FaceClearV(m);
00278
00279 std::deque<FacePointer> visitStack;
00280 size_t selCnt=0;
00281 FaceIterator fi;
00282 for(fi = m.face.begin(); fi != m.face.end(); ++fi)
00283 if( !(*fi).IsD() && (*fi).IsS() && !(*fi).IsV() )
00284 visitStack.push_back(&*fi);
00285
00286 while(!visitStack.empty())
00287 {
00288 FacePointer fp = visitStack.front();
00289 visitStack.pop_front();
00290 assert(!fp->IsV());
00291 fp->SetV();
00292 for(int i=0;i<3;++i) {
00293 FacePointer ff = fp->FFp(i);
00294 if(! ff->IsS())
00295 {
00296 ff->SetS();
00297 ++selCnt;
00298 visitStack.push_back(ff);
00299 assert(!ff->IsV());
00300 }
00301 }
00302 }
00303 return selCnt;
00304 }
00305
00307 static size_t VertexFromQualityRange(MeshType &m,float minq, float maxq)
00308 {
00309 size_t selCnt=0;
00310 ClearVertex(m);
00311 VertexIterator vi;
00312 assert(HasPerVertexQuality(m));
00313 for(vi=m.vert.begin();vi!=m.vert.end();++vi)
00314 if(!(*vi).IsD())
00315 {
00316 if( (*vi).Q()>=minq && (*vi).Q()<=maxq )
00317 {
00318 (*vi).SetS();
00319 ++selCnt;
00320 }
00321 }
00322 return selCnt;
00323 }
00324
00325 static int VertexInBox( MeshType & m, const Box3Type &bb)
00326 {
00327 int selCnt=0;
00328 for (VertexIterator vi = m.vert.begin(); vi != m.vert.end(); ++vi) if(!(*vi).IsD())
00329 {
00330 if(bb.IsIn((*vi).cP()) ) {
00331 (*vi).SetS();
00332 ++selCnt;
00333 }
00334 }
00335 return selCnt;
00336 }
00337
00338
00339 void VertexNonManifoldEdges(MeshType &m)
00340 {
00341 assert(HasFFTopology(m));
00342
00343 VertexClear(m);
00344 for (FaceIterator fi = m.face.begin(); fi != m.face.end(); ++fi) if (!fi->IsD())
00345 {
00346 for(int i=0;i<3;++i)
00347 if(!IsManifold(*fi,i)){
00348 (*fi).V0(i)->SetS();
00349 (*fi).V1(i)->SetS();
00350 }
00351 }
00352 }
00353
00354 };
00355
00356 }
00357 }
00358
00359
00360 #endif