Ejemplo n.º 1
0
        protected override MergeArgs GetMin()
        {
            List <HeapNode <TriMesh.Vertex> > unMergable = new List <HeapNode <TriMesh.Vertex> >();
            HeapNode <TriMesh.Vertex>         node       = heap.Pull();

            while (node != null)
            {
                foreach (var hf in node.Item.HalfEdges)
                {
                    if (TriMeshModify.IsMergeable(hf.Edge))
                    {
                        foreach (var item in unMergable)
                        {
                            heap.Add(item);
                        }
                        Vector3D pos = hf.ToVertex.Traits.Position;
                        return(new MergeArgs()
                        {
                            Target = hf.Edge, Pos = pos
                        });
                    }
                }
                unMergable.Add(node);
                node = heap.Pull();
            }
            return(null);
        }
Ejemplo n.º 2
0
        protected override MergeArgs GetMin()
        {
            List <HeapNode <TriMesh.Face> > unMergable = new List <HeapNode <TriMesh.Face> >();
            HeapNode <TriMesh.Face>         node       = this.heap.Pull();

            while (node != null && !TriMeshModify.IsMergeable(node.Item))
            {
                unMergable.Add(node);
                node = heap.Pull();
            }

            foreach (var item in unMergable)
            {
                this.heap.Add(item);
            }

            if (node == null)
            {
                return(null);
            }
            else
            {
                Vector3D pos = this.GetPos(node.Item);
                return(new MergeArgs {
                    Target = node.Item, Pos = pos
                });
            }
        }
Ejemplo n.º 3
0
 public bool EdgeCollapse(TriMesh.Edge edge)
 {
     if (this.EdgeCanCollapse(edge) && TriMeshModify.IsMergeable(edge))
     {
         TriMeshModify.MergeEdge(edge);
         return(true);
     }
     else
     {
         return(false);
     }
 }
Ejemplo n.º 4
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;
                    }
                    ;
                }
            }
        }
Ejemplo n.º 5
0
 public static bool IsMergeable(TriMesh.Face face)
 {
     if (face.OnBoundary)
     {
         //return false;
     }
     foreach (var hf in face.Halfedges)
     {
         if (!TriMeshModify.IsMergeable(hf.Edge))
         {
             return(false);
         }
     }
     return(true);
 }