bool MeshEvalDentsOnSurface::Evaluate() { this->indices.clear(); MeshRefPointToFacets clPt2Facets(_rclMesh); const MeshPointArray& rPntAry = _rclMesh.GetPoints(); MeshFacetArray::_TConstIterator f_beg = _rclMesh.GetFacets().begin(); MeshGeomFacet rTriangle; Base::Vector3f tmp; unsigned long ctPoints = _rclMesh.CountPoints(); for (unsigned long index=0; index < ctPoints; index++) { std::vector<unsigned long> point; point.push_back(index); // get the local neighbourhood of the point std::set<unsigned long> nb = clPt2Facets.NeighbourPoints(point,1); const std::set<unsigned long>& faces = clPt2Facets[index]; for (std::set<unsigned long>::iterator pt = nb.begin(); pt != nb.end(); ++pt) { const MeshPoint& mp = rPntAry[*pt]; for (std::set<unsigned long>::const_iterator ft = faces.begin(); ft != faces.end(); ++ft) { // the point must not be part of the facet we test if (f_beg[*ft]._aulPoints[0] == *pt) continue; if (f_beg[*ft]._aulPoints[1] == *pt) continue; if (f_beg[*ft]._aulPoints[2] == *pt) continue; // is the point projectable onto the facet? rTriangle = _rclMesh.GetFacet(f_beg[*ft]); if (rTriangle.IntersectWithLine(mp,rTriangle.GetNormal(),tmp)) { const std::set<unsigned long>& f = clPt2Facets[*pt]; this->indices.insert(this->indices.end(), f.begin(), f.end()); break; } } } } // remove duplicates std::sort(this->indices.begin(), this->indices.end()); this->indices.erase(std::unique(this->indices.begin(), this->indices.end()), this->indices.end()); return this->indices.empty(); }