Exemple #1
0
 public CollapsePreconditionReason CollapsePrecondition(bool center = false, CollapsePreconditionReason bits = CollapsePreconditionReason.All)
 {
     return(CollapsePrecondition(center?GetCenter():vert.positionD, bits));
 }
Exemple #2
0
    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);
    }