Beispiel #1
0
 public bool EdgeCollapse(TriMesh.Edge edge)
 {
     if (this.EdgeCanCollapse(edge) && TriMeshModify.IsMergeable(edge))
     {
         TriMeshModify.MergeEdge(edge);
         return(true);
     }
     else
     {
         return(false);
     }
 }
Beispiel #2
0
        public void ClusterVertexs(TriMesh.Vertex[] vertices,
                                   Vector3D position)
        {
            Queue <TriMesh.Edge> connectedEdge =
                new Queue <TriMesh.Edge>();
            Dictionary <TriMesh.Edge, bool> processedFlag =
                new Dictionary <HalfEdgeMesh.Edge, bool>();

            foreach (TriMesh.Vertex v in vertices)
            {
                foreach (TriMesh.HalfEdge hf in v.HalfEdges)
                {
                    foreach (TriMesh.Vertex vx in vertices)
                    {
                        if (hf.ToVertex == vx &&
                            !processedFlag.ContainsKey(hf.Edge))
                        {
                            connectedEdge.Enqueue(hf.Edge);
                            processedFlag[hf.Edge] = true;
                        }
                    }
                }
            }
            int n = 0;

            while (connectedEdge.Count > 0)
            {
                TriMesh.Edge e = connectedEdge.Dequeue();
                if (e.HalfEdge0 == null || e.HalfEdge1 == null)
                {
                    continue;
                }
                if (TriMeshModify.IsMergeable(e))
                {
                    TriMeshModify.MergeEdge(e, position);
                    n = 0;
                }
                else
                {
                    connectedEdge.Enqueue(e);
                    n++;
                    if (n > connectedEdge.Count)
                    {
                        break;
                    }
                    ;
                }
            }
        }
Beispiel #3
0
        public static EdgeContext Merge(TriMesh.Edge edge, Vector3D position)
        {
            TriMesh mesh = (TriMesh)edge.Mesh;

            EdgeContext context = new EdgeContext()
            {
                LeftPos  = edge.Vertex0.Traits.Position,
                MidPos   = position,
                RightPos = edge.Vertex1.Traits.Position,
                Left     = edge.Vertex0.Index,
                Right    = edge.Vertex1.Index,
                Top      = edge.HalfEdge1.Next.ToVertex.Index,
                Bottom   = edge.HalfEdge0.Next.ToVertex.Index,
            };

            TriMeshModify.MergeEdge(edge);

            return(context);
        }
Beispiel #4
0
 private void mergeToolStripMenuItem_Click(object sender, EventArgs e)
 {
     TriMeshModify.MergeEdge(Mesh);
     OnChanged(EventArgs.Empty);
 }
Beispiel #5
0
 protected override TriMesh.Vertex Merge(MergeArgs args)
 {
     return(TriMeshModify.MergeEdge(args.Target, args.Pos));
 }