public static HalfEdge[] FromTriangles(int[] triangles) { var index2vertex = new Dictionary<int, Vertex>(); var halfEdges = new List<HalfEdge>(); var vertex2halfEdges = new Dictionary<Vertex, LinkedList<HalfEdge>>(); for (var i = 0; i < triangles.Length; i+=3) { var face = new Face(); var i0 = triangles[i]; var v0 = index2vertex.ContainsKey(i0) ? index2vertex[i0] : (index2vertex[i0] = new Vertex(){ index = i0 }); var he0 = new HalfEdge() { vertex = v0, face = face }; halfEdges.Add(he0); v0.halfedge = he0; var hedges0 = vertex2halfEdges.ContainsKey(v0) ? vertex2halfEdges[v0] : (vertex2halfEdges[v0] = new LinkedList<HalfEdge>()); hedges0.AddLast(he0); var i1 = triangles[i+1]; var v1 = index2vertex.ContainsKey(i1) ? index2vertex[i1] : (index2vertex[i1] = new Vertex(){ index = i1 }); var he1 = new HalfEdge() { vertex = v1, face = face }; halfEdges.Add(he1); v1.halfedge = he1; var hedges1 = vertex2halfEdges.ContainsKey(v1) ? vertex2halfEdges[v1] : (vertex2halfEdges[v1] = new LinkedList<HalfEdge>()); hedges1.AddLast(he1); var i2 = triangles[i+2]; var v2 = index2vertex.ContainsKey(i2) ? index2vertex[i2] : (index2vertex[i2] = new Vertex(){ index = i2 }); var he2 = new HalfEdge() { vertex = v2, face = face }; halfEdges.Add(he2); v2.halfedge = he2; var hedges2 = vertex2halfEdges.ContainsKey(v2) ? vertex2halfEdges[v2] : (vertex2halfEdges[v2] = new LinkedList<HalfEdge>()); hedges2.AddLast(he2); face.halfedge = he0; he0.next = he1; he1.next = he2; he2.next = he0; } foreach (var he in halfEdges) { if (he.opposite != null) continue; var opposites = vertex2halfEdges[he.next.vertex]; foreach (var opposite in opposites) { if (opposite.next.vertex == he.vertex) { he.opposite = opposite; opposite.opposite = he; break; } } } return halfEdges.ToArray(); }
public void FlipEdge(HalfEdge he) { var f0 = he.face; var f1 = he.opposite.face; var he0a = he.next; var he0b = he0a.next; var he1 = he.opposite; var he1a = he1.next; var he1b = he1a.next; he.vertex = he1b.vertex; he1.vertex = he0b.vertex; f0.halfedge = he0b; he.face = he0b.face = he1a.face = f0; f1.halfedge = he1b; he1.face = he1b.face = he0a.face = f1; he0b.next = he1a; he1a.next = he; he.next = he0b; he1.next = he1b; he1b.next = he0a; he0a.next = he1; _flipCheck.Push(he1a); _flipCheck.Push(he1b); }
public HalfEdge[] SplitTriangle(HalfEdge.Face f, Vector2 p) { faces.Remove(f); var he = f.halfedge; var f0 = new HalfEdge.Face(){ halfedge = he }; var f1 = new HalfEdge.Face(){ halfedge = he.next }; var f2 = new HalfEdge.Face(){ halfedge = he.next.next }; he.face = f0; he.next.face = f1; he.next.next.face = f2; faces.Add(f0); faces.Add(f1); faces.Add(f2); var v = new HalfEdge.Vertex(){ index = vertices.Count }; vertices.Add(p); var he0a = new HalfEdge(){ vertex = v, next = he, face = f0 }; var he0b = new HalfEdge(){ vertex = he.next.vertex, next = he0a, face = f0 }; he = he.next; he0a.next.next = he0b; var he1a = new HalfEdge(){ vertex = v, next = he, face = f1 }; var he1b = new HalfEdge(){ vertex = he.next.vertex, next = he1a, face = f1 }; he = he.next; he1a.next.next = he1b; var he2a = new HalfEdge(){ vertex = v, next = he, face = f2 }; var he2b = new HalfEdge(){ vertex = he.next.vertex, next = he2a, face = f2 }; he = he.next; he2a.next.next = he2b; he0a.opposite = he2b; he2b.opposite = he0a; he1a.opposite = he0b; he0b.opposite = he1a; he2a.opposite = he1b; he1b.opposite = he2a; halfEdges.AddRange(new HalfEdge[]{ he0a, he0b, he1a, he1b, he2a, he2b }); return new HalfEdge[]{ f0.halfedge, f1.halfedge, f2.halfedge }; }