private bool IsVerticesLinear() { List <Vector3D> list = new List <Vector3D>(); double maxDist = 0; int maxIndexFrom = -1; int maxIndexTo = -1; var hes = Circulate(); for (int i = 0; i < hes.Count; i++) { var pos = hes[i].vert.positionD; if (list.Count > 2) { for (int j = 0; j < list.Count; j++) { double dist = Vector3D.Distance(pos, list[j]); if (dist > maxDist) { maxDist = dist; maxIndexFrom = i; maxIndexTo = j; } } } list.Add(pos); } if (maxIndexFrom == maxIndexTo) { // all same position return(true); } RayD r = new RayD(list[maxIndexFrom], list[maxIndexFrom] - list[maxIndexTo]); foreach (var p in list) { if (r.LinePointDistance(p) > hmesh.zeroMagnitudeTreshold) { // not linear return(false); } } return(true); }
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); }
private static double VertexDistOnDissolve(Vertex toDissolve, Vertex neighbour1, Vertex neighbour2) { RayD r = new RayD(neighbour1.positionD, neighbour2.positionD - neighbour1.positionD); return(r.LinePointDistance(toDissolve.positionD)); }