예제 #1
0
        /**
         * Build neighbourly relations between vertices and wedges using the triangles of the model
         **/
        private void BuildNeighbourlyRelations(List <Wedge> wedges, Vertex[] vertices, int[] tris)
        {
            for (int i = 0; i != tris.Length; i += 3)
            {
                Vertex v0 = vertices[tris[i]];
                Vertex v1 = vertices[tris[i + 1]];
                Vertex v2 = vertices[tris[i + 2]];

                Triangle triangle = new Triangle(v0, v1, v2);

                //Set this triangle as an adjacent triangle for every vertex
                v0.AddAdjacentTriangle(triangle);
                v1.AddAdjacentTriangle(triangle);
                v2.AddAdjacentTriangle(triangle);

                Wedge w0 = GetWedgeHoldingVertex(wedges, v0);
                Wedge w1 = GetWedgeHoldingVertex(wedges, v1);
                Wedge w2 = GetWedgeHoldingVertex(wedges, v2);
                w0.AddNeighbor(w1);
                w0.AddNeighbor(w2);
                w1.AddNeighbor(w0);
                w1.AddNeighbor(w2);
                w2.AddNeighbor(w0);
                w2.AddNeighbor(w1);
            }
        }
예제 #2
0
        /**
         * Build neighbourly relations between vertices and wedges using the triangles of the model
         **/
        private void BuildNeighbourlyRelations(List <Wedge> wedges, Vertex[] vertices, List <int> tris)
        {
            for (int i = 0; i != tris.Count; i += 3)
            {
                Vertex v0 = vertices[tris[i]];
                Vertex v1 = vertices[tris[i + 1]];
                Vertex v2 = vertices[tris[i + 2]];

                Triangle triangle = new Triangle(v0, v1, v2);
                //m_triangles.Add(triangle);

                //Set this triangle as an adjacent triangle for every vertex
                //v0.AddAdjacentTriangle(triangle);
                //v1.AddAdjacentTriangle(triangle);
                //v2.AddAdjacentTriangle(triangle);

                //for each triangle vertex, set the 2 opposite points as neighbors
                //v0.AddNeighbor(v1);
                //v0.AddNeighbor(v2);
                //v1.AddNeighbor(v0);
                //v1.AddNeighbor(v2);
                //v2.AddNeighbor(v0);
                //v2.AddNeighbor(v1);

                Wedge w0 = GetWedgeHoldingVertex(wedges, v0);
                Wedge w1 = GetWedgeHoldingVertex(wedges, v1);
                Wedge w2 = GetWedgeHoldingVertex(wedges, v2);

                w0.AddNeighbor(w1);
                w0.AddNeighbor(w2);
                w1.AddNeighbor(w0);
                w1.AddNeighbor(w2);
                w2.AddNeighbor(w0);
                w2.AddNeighbor(w1);

                WedgeTriangle wedgeTriangle = new WedgeTriangle(w0, w1, w2);
                wedgeTriangle.m_mappedVertexTriangle = triangle; //map here the vertex triangle to the wedge triangle

                if (wedges == m_initialWedges)                   //populate the m_originalTriangles using the m_initialWedges list only
                {
                    m_originalTriangles.Add(wedgeTriangle);
                }

                w0.AddAdjacentTriangle(wedgeTriangle);
                w1.AddAdjacentTriangle(wedgeTriangle);
                w2.AddAdjacentTriangle(wedgeTriangle);
            }
        }
예제 #3
0
        /**
         * Collapse the wedge u onto the wedge v
         * **/
        private void Collapse(Wedge u, Wedge v)
        {
            //Collapse the edge uv by moving wedge u onto v
            // Actually remove tris on uv, then update tris that
            // have u to have v, and then remove u.
            if (v == null)
            {
                // u is a vertex all by itself so just delete it
                u.Delete();
                m_wedges.Remove(u);
                return;
            }

            // delete triangles on edge uv:
            List <WedgeTriangle> uvSharedTriangles = u.GetSharedTrianglesWithWedge(v);

            for (int i = 0; i != uvSharedTriangles.Count; i++)
            {
                uvSharedTriangles[i].Delete();
            }

            // update remaining triangles to have v instead of u
            for (int i = 0; i != u.AdjacentTriangles.Count; i++)
            {
                u.AdjacentTriangles[i].ReplaceWedge(u, v);
            }

            //add u neighbors to v and add v as a new neighbor of u neighbors
            for (int i = 0; i != u.Neighbors.Count; i++)
            {
                if (u.Neighbors[i] != v)
                {
                    v.AddNeighbor(u.Neighbors[i]);
                    u.Neighbors[i].AddNeighbor(v);
                }
            }

            u.Delete();
            m_wedges.Remove(u);

            // recompute the edge collapse costs for neighboring vertices
            for (int i = 0; i < u.Neighbors.Count; i++)
            {
                ComputeEdgeCostAtWedge(u.Neighbors[i]);
            }
        }
예제 #4
0
        /**
         * Collapse the wedge u onto the wedge v
         * **/
        private void Collapse(Wedge u, Wedge v)
        {
            // Collapse the edge uv by moving vertex u onto v
            // Actually remove tris on uv, then update tris that
            // have u to have v, and then remove u.
            if (v == null)
            {
                // u is a vertex all by itself so just delete it
                u.Delete();
                m_wedges.Remove(u);
                return;
            }

            //Find vertices that will collapse or be displaced
            for (int i = 0; i != u.Vertices.Count; i++)
            {
                Vertex vertex         = u.Vertices[i];
                Vertex collapseVertex = vertex.FindVertexToCollapseOn(v); //the vertex it will collapse on if it exists

                if (collapseVertex != null)
                {
                    u.m_collapsedVertices.Add(vertex.ID, collapseVertex.ID); //no exception will be thrown as unique IDs are inserted into that dictionary

                    //CollapsedVertex collapsedVertex = new CollapsedVertex(vertex.ID, collapseVertex.ID);

                    //u.m_collapsedVertices.Add(collapsedVertex);
                }
                else
                {
                    DisplacedVertex displacedVertex = new DisplacedVertex();
                    displacedVertex.m_index          = vertex.ID;
                    displacedVertex.m_targetPosition = v.m_position;

                    u.m_displacedVertices.Add(displacedVertex);
                }
            }

            //delete triangles on edge[u - v]
            List <Triangle> sharedTriangles = u.GetSharedTrianglesWithWedge(v);

            for (int i = 0; i != sharedTriangles.Count; i++)
            {
                //delete the triangle
                sharedTriangles[i].Delete();

                for (int j = 0; j != sharedTriangles[i].Vertices.Length; j++)
                {
                    Vertex vertex = sharedTriangles[i].Vertices[j];

                    if (!u.HasVertex(vertex) && !v.HasVertex(vertex)) //the third wedge that is not u or v holds this vertex
                    {
                        if (vertex.AdjacentTriangles.Count == 0)      //vertex is isolated, remove it
                        {
                            //find the wedge and remove the vertex from its internal list
                            GetWedgeHoldingVertex(m_wedges, vertex).RemoveVertex(vertex);
                            //add the vertex ID to the list of vertices deleted during the operation of collapsing u onto v
                            u.m_deletedVertices.Add(vertex.ID);
                        }
                    }
                }
            }

            //perform the actual collapse
            u.CollapseOnWedge(v);

            //add u neighbors to v and add v as a new neighbor of u neighbors
            for (int i = 0; i != u.Neighbors.Count; i++)
            {
                if (u.Neighbors[i] != v)
                {
                    v.AddNeighbor(u.Neighbors[i]);
                    u.Neighbors[i].AddNeighbor(v);
                }
            }

            //neighbors of wedge u are likely to have lost one triangle through one of their vertex so invalidate them
            for (int i = 0; i != u.Neighbors.Count; i++)
            {
                u.Neighbors[i].InvalidateAdjacentTriangles();
            }

            //delete the wedge and remove it from global list
            u.Delete();
            m_wedges.Remove(u);

            // recompute the edge collapse costs for neighboring wedges
            for (int i = 0; i < u.Neighbors.Count; i++)
            {
                ComputeEdgeCostAtWedge(u.Neighbors[i]);
            }
        }