public HalfEdge Split(Vertex midpoint) { Mesh.InformSplitMidpointBegin(this, midpoint); if (midpoint.Equals(End) || midpoint.Equals(Twin.End)) { return(this); } var a = Twin.End; var m = midpoint; var b = End; Twin.End = m; var bm = Twin; var mb = this; var am = Mesh.GetEdge(a, m, Face, Face == null ? null : mb, mb.Twin.Face, mb.Twin.Next); var ma = am.Twin; if (Face != null) { bm.Next = ma; Face.Edges.Where(e => e.Next == this).First().Next = am; } if (Twin.Face != null) { Twin.Face.Edges.Where(e => e.Next == Twin).First().Next = bm; } Mesh.InformSplitMidpointEnd(this, midpoint); return(am); }
/// <summary> /// Inserts a midpoint into this face /// Deletes this face /// </summary> /// <param name="midpoint">The midpoint.</param> public void InsertMidpoint(Vertex midpoint) { Mesh.InformSplitMidpointBegin(this, midpoint); var edges = Edges.ToArray(); Delete(); for (int i = 0; i < edges.Length; i++) { var v1 = edges[i].End; var v2 = edges[(i + 1) % edges.Length].End; Mesh.GetFace(v1, v2, midpoint); } Mesh.InformSplitMidpointEnd(this, midpoint); }