Fix incorrect FarMeshFactory logic for isolating multiple corner vertices in corner patches.

- the previous fix omitted to use the corner count which might have caused trouble with certain topologies

fixes #294
This commit is contained in:
manuelk 2014-04-30 19:02:28 -07:00
parent 1284fa958b
commit bba6cda858

View File

@ -374,11 +374,15 @@ FarMeshFactory<T,U>::vertexIsBSpline( HbrVertex<T> * v, bool next ) {
// corner vertex
HbrFace<T> * f = v->GetFace();
// the vertex may not need isolation depending on boundary
// interpolation rule (sharp vs. rounded corner)
typename HbrMesh<T>::InterpolateBoundaryMethod method =
f->GetMesh()->GetInterpolateBoundaryMethod();
if (method==HbrMesh<T>::k_InterpolateBoundaryEdgeAndCorner) {
// vertex may not need isolation depending on boundary
// interpolation rule (sharp vs. rounded corner)
if (not next) {
// if we are checking coarse vertices (next==false),
// count the number of corners in the face, because we
// can only have 1 corner vertex in a corner patch.
int nsharpboundaries=0;
for (int i=0; i<f->GetNumVertices(); ++i) {
HbrHalfedge<T> * e = f->GetEdge(i);
@ -387,7 +391,9 @@ FarMeshFactory<T,U>::vertexIsBSpline( HbrVertex<T> * v, bool next ) {
++nsharpboundaries;
}
}
return next;
return nsharpboundaries < 3 ? true: false;
} else
return true;
} else
return false;
} else if (valence>3) {
@ -501,7 +507,7 @@ FarMeshFactory<T,U>::refineAdaptive( HbrMesh<T> * mesh, int maxIsolate ) {
// for refinement as boundary patches.
//
// o ........ o ........ o ........ o
// . | | . ... b.undary edge
// . | | . ... boundary edge
// . | needs | .
// . | flag | . --- regular edge
// . | | .