Exemple #1
0
        void optimize_mesh(DMesh3 mesh)
        {
            Reducer         reducer     = new Reducer(mesh);
            MeshConstraints constraints = new MeshConstraints();

            MeshConstraintUtil.FixAllBoundaryEdges(constraints, mesh);
            reducer.SetExternalConstraints(constraints);
            reducer.ReduceToTriangleCount(1);

            Vector3d a, b, c, d;

            a = b = c = d = Vector3d.Zero;

            bool done = false;

            while (!done)
            {
                done = true;

                for (int eid = 0; eid < mesh.MaxEdgeID; ++eid)
                {
                    if (mesh.IsEdge(eid) == false)
                    {
                        continue;
                    }

                    Index4i evt = mesh.GetEdge(eid);
                    if (evt.d == DMesh3.InvalidID)
                    {
                        continue;
                    }
                    a = mesh.GetVertex(evt.a); b = mesh.GetVertex(evt.b);
                    Index2i ov = mesh.GetEdgeOpposingV(eid);
                    c = mesh.GetVertex(ov.a); d = mesh.GetVertex(ov.b);

                    if (c.DistanceSquared(d) > a.DistanceSquared(b))
                    {
                        continue;
                    }
                    if (MeshUtil.CheckIfEdgeFlipCreatesFlip(mesh, eid))
                    {
                        continue;
                    }

                    DMesh3.EdgeFlipInfo flipInfo;
                    if (mesh.FlipEdge(eid, out flipInfo) == MeshResult.Ok)
                    {
                        done = false;
                    }
                }
            }
        }
Exemple #2
0
        bool Sort(ref int v0, ref int v1, ref int v2, ref int v3)
        {
            int  j0, j1, j2, j3;
            bool positive;

            if (v0 < v1)
            {
                if (v2 < v3)
                {
                    if (v1 < v2)
                    {
                        j0 = 0; j1 = 1; j2 = 2; j3 = 3; positive = true;
                    }
                    else if (v3 < v0)
                    {
                        j0 = 2; j1 = 3; j2 = 0; j3 = 1; positive = true;
                    }
                    else if (v2 < v0)
                    {
                        if (v3 < v1)
                        {
                            j0 = 2; j1 = 0; j2 = 3; j3 = 1; positive = false;
                        }
                        else
                        {
                            j0 = 2; j1 = 0; j2 = 1; j3 = 3; positive = true;
                        }
                    }
                    else
                    {
                        if (v3 < v1)
                        {
                            j0 = 0; j1 = 2; j2 = 3; j3 = 1; positive = true;
                        }
                        else
                        {
                            j0 = 0; j1 = 2; j2 = 1; j3 = 3; positive = false;
                        }
                    }
                }
                else
                {
                    if (v1 < v3)
                    {
                        j0 = 0; j1 = 1; j2 = 3; j3 = 2; positive = false;
                    }
                    else if (v2 < v0)
                    {
                        j0 = 3; j1 = 2; j2 = 0; j3 = 1; positive = false;
                    }
                    else if (v3 < v0)
                    {
                        if (v2 < v1)
                        {
                            j0 = 3; j1 = 0; j2 = 2; j3 = 1; positive = true;
                        }
                        else
                        {
                            j0 = 3; j1 = 0; j2 = 1; j3 = 2; positive = false;
                        }
                    }
                    else
                    {
                        if (v2 < v1)
                        {
                            j0 = 0; j1 = 3; j2 = 2; j3 = 1; positive = false;
                        }
                        else
                        {
                            j0 = 0; j1 = 3; j2 = 1; j3 = 2; positive = true;
                        }
                    }
                }
            }
            else
            {
                if (v2 < v3)
                {
                    if (v0 < v2)
                    {
                        j0 = 1; j1 = 0; j2 = 2; j3 = 3; positive = false;
                    }
                    else if (v3 < v1)
                    {
                        j0 = 2; j1 = 3; j2 = 1; j3 = 0; positive = false;
                    }
                    else if (v2 < v1)
                    {
                        if (v3 < v0)
                        {
                            j0 = 2; j1 = 1; j2 = 3; j3 = 0; positive = true;
                        }
                        else
                        {
                            j0 = 2; j1 = 1; j2 = 0; j3 = 3; positive = false;
                        }
                    }
                    else
                    {
                        if (v3 < v0)
                        {
                            j0 = 1; j1 = 2; j2 = 3; j3 = 0; positive = false;
                        }
                        else
                        {
                            j0 = 1; j1 = 2; j2 = 0; j3 = 3; positive = true;
                        }
                    }
                }
                else
                {
                    if (v0 < v3)
                    {
                        j0 = 1; j1 = 0; j2 = 3; j3 = 2; positive = true;
                    }
                    else if (v2 < v1)
                    {
                        j0 = 3; j1 = 2; j2 = 1; j3 = 0; positive = true;
                    }
                    else if (v3 < v1)
                    {
                        if (v2 < v0)
                        {
                            j0 = 3; j1 = 1; j2 = 2; j3 = 0; positive = false;
                        }
                        else
                        {
                            j0 = 3; j1 = 1; j2 = 0; j3 = 2; positive = true;
                        }
                    }
                    else
                    {
                        if (v2 < v0)
                        {
                            j0 = 1; j1 = 3; j2 = 2; j3 = 0; positive = true;
                        }
                        else
                        {
                            j0 = 1; j1 = 3; j2 = 0; j3 = 2; positive = false;
                        }
                    }
                }
            }

            Index4i value = new Index4i(v0, v1, v2, v3);

            v0 = value[j0];
            v1 = value[j1];
            v2 = value[j2];
            v3 = value[j3];
            return(positive);
        }