/// <summary> /// See CGALCSharp.Test/Meshes/HalfEdgeBased/Cross.png /// </summary> /// <returns></returns> public static HBMesh <HBVertex, HBEdge, HBFace> CreateCross() { var mesh = new HBMesh <HBVertex, HBEdge, HBFace>(); mesh.Fill(5, 8, 0); var E = mesh.Edges; var V = mesh.Vertices; V[0].Edge = E[1]; V[1].Edge = E[3]; V[2].Edge = E[5]; V[3].Edge = E[7]; V[4].Edge = E[0]; E[0].Set(V[4], null, null, E[7], E[1]); E[1].Set(V[0], null, E[2], null, E[0]); E[2].Set(V[4], null, null, E[1], E[3]); E[3].Set(V[1], null, E[4], null, E[2]); E[4].Set(V[4], null, null, E[3], E[5]); E[5].Set(V[2], null, E[6], null, E[4]); E[6].Set(V[4], null, null, E[5], E[7]); E[7].Set(V[3], null, E[0], null, E[6]); return(mesh); }
public static HBMesh <HBVertex2f, HBEdge, HBFace> CreateTriangle(Vector2f A, Vector2f B, Vector2f C) { var mesh = new HBMesh <HBVertex2f, HBEdge, HBFace>(); mesh.Fill(3, 3, 1); var E = mesh.Edges; var V = mesh.Vertices; var F = mesh.Faces; F[0].Edge = E[0]; V[0].Edge = E[0]; V[1].Edge = E[1]; V[2].Edge = E[2]; V[0].Position = A; V[1].Position = B; V[2].Position = C; E[0].Set(V[0], F[0], E[2], E[1], null); E[1].Set(V[1], F[0], E[0], E[2], null); E[2].Set(V[2], F[0], E[1], E[0], null); return(mesh); }
public void WeldVerticesNoEdges() { var mesh = new HBMesh <HBVertex2f, HBEdge, HBFace>(); HBVertex2f[] verts = new HBVertex2f[] { new HBVertex2f(new Vector2f(-1, 1)), new HBVertex2f(new Vector2f(1, 1)), new HBVertex2f(new Vector2f(1, -1)), new HBVertex2f(new Vector2f(-1, -1)), new HBVertex2f(new Vector2f(0, 0.1f)), new HBVertex2f(new Vector2f(0, -0.1f)) }; mesh.Vertices.AddRange(verts); HBWeldVertices.WeldVertices(mesh, 0.21f); Assert.AreEqual(5, mesh.Vertices.Count); Assert.IsTrue(mesh.Vertices.Contains(verts[0])); Assert.IsTrue(mesh.Vertices.Contains(verts[1])); Assert.IsTrue(mesh.Vertices.Contains(verts[2])); Assert.IsTrue(mesh.Vertices.Contains(verts[3])); Assert.IsTrue(mesh.Vertices.Contains(verts[4]) || mesh.Vertices.Contains(verts[5])); }
/// <summary> /// Create the lines to show the connections between faces /// for a half edge based mesh. /// </summary> void CreateConnectionLines(HBMesh <HBVertex2f, HBEdge, HBFace> mesh) { linePositions = new List <Vector2f>(); lineIndices = new List <int>(); foreach (var face in mesh.Faces) { Vector2f center = Vector2f.Zero; foreach (HBVertex2f v in face.Edge.EnumerateVertices()) { center += v.Position; } center /= 3.0f; foreach (var edge in face.Edge.EnumerateEdges()) { if (edge.Opposite == null) { continue; } var neighbor = edge.Opposite.Face; Vector2f c = Vector2f.Zero; foreach (HBVertex2f v in neighbor.Edge.EnumerateVertices()) { c += v.Position; } c /= 3.0f; int count = linePositions.Count; linePositions.Add(center); linePositions.Add(c); lineIndices.Add(count); lineIndices.Add(count + 1); } } }
public static HBMesh <HBVertex, HBEdge, HBFace> CreateTriangle() { var mesh = new HBMesh <HBVertex, HBEdge, HBFace>(); mesh.Fill(3, 3, 1); var E = mesh.Edges; var V = mesh.Vertices; var F = mesh.Faces; F[0].Edge = E[0]; V[0].Edge = E[0]; V[1].Edge = E[1]; V[2].Edge = E[2]; E[0].Set(V[0], F[0], E[2], E[1], null); E[1].Set(V[1], F[0], E[0], E[2], null); E[2].Set(V[2], F[0], E[1], E[0], null); return(mesh); }
/// <summary> /// See CGALCSharp.Test/Meshes/HalfEdgeBased/SquareWithCenter.png /// </summary> /// <returns></returns> public static HBMesh <HBVertex, HBEdge, HBFace> CreateSquareWithCenter() { var mesh = new HBMesh <HBVertex, HBEdge, HBFace>(); mesh.Fill(5, 12, 4); var E = mesh.Edges; var V = mesh.Vertices; var F = mesh.Faces; V[0].Edge = E[1]; V[1].Edge = E[3]; V[2].Edge = E[5]; V[3].Edge = E[7]; V[4].Edge = E[0]; F[0].Edge = E[8]; F[1].Edge = E[9]; F[2].Edge = E[10]; F[3].Edge = E[11]; E[0].Set(V[4], F[3], E[11], E[7], E[1]); E[1].Set(V[0], F[0], E[2], E[8], E[0]); E[2].Set(V[4], F[0], E[8], E[1], E[3]); E[3].Set(V[1], F[1], E[4], E[9], E[2]); E[4].Set(V[4], F[1], E[9], E[3], E[5]); E[5].Set(V[2], F[2], E[6], E[10], E[4]); E[6].Set(V[4], F[2], E[10], E[5], E[7]); E[7].Set(V[3], F[3], E[0], E[11], E[6]); E[8].Set(V[1], F[0], E[1], E[2], null); E[9].Set(V[2], F[1], E[3], E[4], null); E[10].Set(V[3], F[2], E[5], E[6], null); E[11].Set(V[0], F[3], E[7], E[0], null); return(mesh); }