/** * 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); } }
/** * 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); } }
/** * 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]); } }
/** * 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]); } }