Esempio n. 1
0
    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);
    }
Esempio n. 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);
    }
Esempio n. 3
0
    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));
    }