public void Mesh_CreateTetrahedron() { string v1Traits = "v1"; string v2Traits = "v2"; string v3Traits = "v3"; string faceTraits = "face1"; var mesh = new StringMesh(); var face = mesh.CreateTriangle(v1Traits, v2Traits, v3Traits, faceTraits); var v4Traits = "v4"; var face2Traits = "face2"; var face3Traits = "face3"; var face4Traits = "face4"; // Recover the first vertex var v1 = face.Bounding.Source; var v2 = face.Bounding.Target; var v3 = face.Bounding.Next.Target; // Use it to make next triangle - careful with sequence V2 -> v1 var face2 = mesh.CreateTriangle(v2, v1, v4Traits, face2Traits); var v4 = face2.Bounding.Next.Target; // Recover halfedges var e21 = v2.HalfedgeTo(v1); var e14 = v1.HalfedgeTo(v4); var e42 = v4.HalfedgeTo(v2); var e12 = e21.Opposite; var e41 = e14.Opposite; var e24 = e42.Opposite; var face3 = mesh.CreateTriangle(v3, v4, v1, face3Traits); var face4 = mesh.CreateFace(e24, face4Traits); foreach (var he in mesh.Halfedges) { Assert.IsNotNull(he.Face); } Assert.AreEqual(4, mesh.Faces.Count); Assert.AreEqual(4, mesh.Vertices.Count); }