Commit 774ea2c9 by Sylvain Thery

### problems in isPointInVolume

parent 66bbb974
 ... ... @@ -62,6 +62,7 @@ bool isConvex(typename PFP::MAP& map, Dart d, const VertexAttribute bool isPointInVolume(typename PFP::MAP& map, Dart d, const VertexAttribute& position, const typename PFP::VEC3& point) { ... ... @@ -70,58 +71,90 @@ bool isPointInVolume(typename PFP::MAP& map, Dart d, const VertexAttribute(map,d)) { // CGoGNout << "optimize point in volume" << CGoGNendl; // } std::list visitedFaces; // Faces that are traversed visitedFaces.push_back(d); // Start with the face of d std::list::iterator face; VEC3 dir(0.5f,0.5f,0.5f); VEC3 dir(1.0f,1.0f,1.0f); VEC3 inter; std::vector interPrec; interPrec.reserve(16); DartMarkerStore mark(map); // Lock a marker // For every face added to the list // search the number of faces intersected by a ray whose origin is the tested point for (face = visitedFaces.begin(); face != visitedFaces.end(); ++face) Traversor3WF trav(map,d); for (Dart e = trav.begin(); e!= trav.end(); e = trav.next()) { if (!mark.isMarked(*face)) // Face has not been visited yet bool interRes = Algo::Geometry::intersectionLineConvexFace(map, e, position, point, dir, inter); if(interRes && (dir * (inter-point)) >= 0.0f) { // check if already intersect on same point (a vertex certainly) bool alreadyfound = false; bool interRes = Algo::Geometry::intersectionLineConvexFace(map, *face, position, point, dir, inter); if(interRes && (dir * (inter-point)) >= 0.0f) for(typename std::vector::iterator it = interPrec.begin(); !alreadyfound && it != interPrec.end(); ++it) { if (Geom::arePointsEquals(*it,inter)) alreadyfound = true; } if (!alreadyfound) { if(interPrec.size() > 0) { for(typename std::vector::iterator it = interPrec.begin(); !alreadyfound && it != interPrec.end(); ++it) { if((*it)[0] == inter[0]) alreadyfound = true; } } if(!alreadyfound) { ++countInter; interPrec.push_back(inter); } // add non visited adjacent faces to the list of face Dart dNext = *face ; do { mark.mark(dNext); // Mark Dart adj = map.phi2(dNext); // Get adjacent face if (adj != dNext && !mark.isMarked(adj)) visitedFaces.push_back(adj); // Add it dNext = map.phi1(dNext) ; } while(dNext != *face) ; ++countInter; interPrec.push_back(inter); } } } //if the point is in the volume there is an odd number of intersection with all faces with any direction return (countInter % 2) == 1; // if(isConvex(map,d)) { // CGoGNout << "optimize point in volume" << CGoGNendl; // } // // std::list visitedFaces; // Faces that are traversed // visitedFaces.push_back(d); // Start with the face of d // std::list::iterator face; // VEC3 dir(0.5f,0.5f,0.5f); // VEC3 inter; // std::vector interPrec; // // DartMarkerStore mark(map); // Lock a marker // // For every face added to the list // // search the number of faces intersected by a ray whose origin is the tested point // for (face = visitedFaces.begin(); face != visitedFaces.end(); ++face) // { // if (!mark.isMarked(*face)) // Face has not been visited yet // { // bool alreadyfound = false; // bool interRes = Algo::Geometry::intersectionLineConvexFace(map, *face, position, point, dir, inter); // if(interRes && (dir * (inter-point)) >= 0.0f) // { // if(interPrec.size() > 0) // { // for(typename std::vector::iterator it = interPrec.begin(); !alreadyfound && it != interPrec.end(); ++it) // { // if (Geom::arePointsEquals(*it,inter)) //// if((*it)[0] == inter[0]) // alreadyfound = true; // } // } // if(!alreadyfound) // { // ++countInter; // interPrec.push_back(inter); // } // // // add non visited adjacent faces to the list of face // Dart dNext = *face ; // do // { // mark.mark(dNext); // Mark // Dart adj = map.phi2(dNext); // Get adjacent face // if (adj != dNext && !mark.isMarked(adj)) // visitedFaces.push_back(adj); // Add it // dNext = map.phi1(dNext) ; // } while(dNext != *face) ; // } // } // } // // //if the point is in the volume there is an odd number of intersection with all faces with any direction // return (countInter % 2) == 1; } template ... ...
 ... ... @@ -169,7 +169,7 @@ bool arePointsEquals(const VEC& point1, const VEC& point2) { VEC v(point1 - point2); #define PRECISION 1e-3 #define PRECISION 1e-10 return v.norm2() <= PRECISION ; #undef PRECISION } ... ...
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment