public CollapsePreconditionReason CollapsePrecondition(bool center = false, CollapsePreconditionReason bits = CollapsePreconditionReason.All) { return(CollapsePrecondition(center?GetCenter():vert.positionD, bits)); }
public CollapsePreconditionReason CollapsePrecondition(Vector3D newPosition, CollapsePreconditionReason bits = CollapsePreconditionReason.All) { if ((bits & CollapsePreconditionReason.EdgeIsBoundary) == CollapsePreconditionReason.EdgeIsBoundary) { if (IsBoundary()) { return(CollapsePreconditionReason.EdgeIsBoundary); } } if ((bits & CollapsePreconditionReason.VertexIsBoundary) == CollapsePreconditionReason.VertexIsBoundary) { if (vert.IsBoundary()) { return(CollapsePreconditionReason.VertexIsBoundary); } if (prev.vert.IsBoundary()) { return(CollapsePreconditionReason.VertexIsBoundary); } } var prevVert = prev.vert; Vector3D prevVertPos = prevVert.positionD; bool checkForNormalFlipped = (bits & CollapsePreconditionReason.NormalFlipped) == CollapsePreconditionReason.NormalFlipped; bool checkCollapsePointTooCloseToLine = (bits & CollapsePreconditionReason.CollapsePointTooCloseToLine) == CollapsePreconditionReason.CollapsePointTooCloseToLine; // test for flipped normal var hes = prevVert.Circulate(); foreach (var he in hes) { if (he == this || he.prev.opp == this) { continue; } Vector3D dirA = he.vert.positionD - prevVertPos; Vector3D dirB = he.prev.prev.vert.positionD - prevVertPos; Vector3D dirC = Vector3D.Cross(dirA, dirB); Vector3D dirMovedA = he.vert.positionD - newPosition; Vector3D dirMovedB = he.prev.prev.vert.positionD - newPosition; Vector3D dirMovedC = Vector3D.Cross(dirMovedA, dirMovedB); if (checkForNormalFlipped) { bool isNormalFlipped = Vector3D.Dot(dirC, dirMovedC) < 0; if (isNormalFlipped) { return(CollapsePreconditionReason.NormalFlipped); } } if (checkCollapsePointTooCloseToLine) { // test for tree points line up RayD ray = new RayD(he.vert.positionD, (he.vert.positionD - he.prev.prev.vert.positionD)); double distToLine = ray.LinePointDistance(newPosition); if (distToLine < hmesh.zeroMagnitudeTreshold) { return(CollapsePreconditionReason.CollapsePointTooCloseToLine); } } } return(CollapsePreconditionReason.Ok); }