public void TestPlacementGeneralMiddleCase() { // Use mesh order for edges Placement.SetEdgeOrder(-1); // No two points share the same X position var mesh = new BndFactory(2).CreateMesh() as BndMesh; BuildTrapezoid(mesh); // ReSharper disable once PossibleNullReferenceException mesh.FinalizeMesh(); var tree = Placement.GetPlacementTree(mesh); Assert.IsNotNull(tree.LocateFace((T)0.5, (T)0.1)); Assert.IsNotNull(tree.LocateFace((T)1.5, (T)0.1)); Assert.IsNotNull(tree.LocateFace((T)2.5, (T)0.1)); Assert.IsNull(tree.LocateFace((T)(-1), (T)0)); Assert.IsNull(tree.LocateFace((T)0.5, (T)(-1))); Assert.IsNull(tree.LocateFace((T)0.5, (T)3)); Assert.IsNull(tree.LocateFace((T)1.5, (T)(-1))); Assert.IsNull(tree.LocateFace((T)1.5, (T)3)); Assert.IsNull(tree.LocateFace((T)2.5, (T)0.9)); Assert.IsNull(tree.LocateFace((T)2.5, (T)3)); }
public void TestSetOrientation() { var mesh = new BndFactory(2).CreateMesh() as BndMesh; var face = BuildCcwSquare(mesh); // ReSharper disable PossibleNullReferenceException mesh.FinalizeMesh(); var vertsCcw = face.Vertices().ToList(); var boundaryFace = mesh.Faces.First(f => f != face); Assert.IsTrue(boundaryFace.IsBoundary); Assert.IsFalse(face.IsBoundary); Assert.IsTrue(face.Vertices().Zip(vertsCcw, (v1, v2) => v1 == v2).All(f => f)); mesh.SetOrientation(true); Assert.IsTrue(face.Vertices().Zip(vertsCcw, (v1, v2) => v1 == v2).All(f => f)); mesh.SetOrientation(false); // We are reversed, but in flipping the first edge to point (0,0)->(0,1) so that it // points (0,1)->(0,0) the initial vertex of the face has been changed to (0,1) so // we have to shift to account for that. vertsCcw = vertsCcw.Skip(2).Concat(vertsCcw.Take(2)).ToList(); // ReSharper restore PossibleNullReferenceException Assert.IsTrue(face.Vertices().Reverse().Zip(vertsCcw, (v1, v2) => v1 == v2).All(f => f)); }
public void TestPlacementSerialization() { var sb = new StringBuilder(); var sw = new StringWriter(sb); // Use mesh order for edges Placement.SetEdgeOrder(-1); // No two points share the same X position var mesh = new BndFactory(2).CreateMesh() as BndMesh; BuildTrapezoid(mesh); // ReSharper disable once PossibleNullReferenceException mesh.FinalizeMesh(); var tree = Placement.GetPlacementTree(mesh); Placement.Serialize(tree, f => f == null ? "outside" : "The one and only!", sw); StringReader sr = new StringReader(sb.ToString()); tree = Placement.Deserialize(s => s, sr); Assert.AreEqual(tree.Locate((T)0.5, (T)0.1), "The one and only!"); Assert.AreEqual(tree.Locate((T)1.5, (T)0.1), "The one and only!"); Assert.AreEqual(tree.Locate((T)2.5, (T)0.1), "The one and only!"); Assert.AreEqual(tree.Locate((T)(-1), (T)0), "outside"); Assert.AreEqual(tree.Locate((T)0.5, (T)(-1)), "outside"); Assert.AreEqual(tree.Locate((T)0.5, (T)3), "outside"); Assert.AreEqual(tree.Locate((T)1.5, (T)(-1)), "outside"); Assert.AreEqual(tree.Locate((T)1.5, (T)3), "outside"); Assert.AreEqual(tree.Locate((T)2.5, (T)0.9), "outside"); Assert.AreEqual(tree.Locate((T)2.5, (T)3), "outside"); }
public void TestBuildSquare() { var mesh = new BndFactory(2).CreateMesh() as BndMesh; var face = BuildSquare(mesh); mesh.FinalizeMesh(); Assert.AreEqual(1, mesh.BoundaryFaces.Count); Assert.AreEqual(4, face.Edges().Count()); Assert.AreEqual(4, mesh.BoundaryFaces[0].Edges().Count()); foreach (var halfEdge in face.Edges()) { Assert.AreEqual(face, halfEdge.Face); Assert.AreEqual(mesh.BoundaryFaces[0], halfEdge.OppositeFace); } mesh = (BndMesh)mesh.Clone(); face = mesh.Faces.First(f => !f.IsBoundary); Assert.AreEqual(1, mesh.BoundaryFaces.Count); Assert.AreEqual(4, face.Edges().Count()); Assert.AreEqual(4, mesh.BoundaryFaces[0].Edges().Count()); foreach (var halfEdge in face.Edges()) { Assert.AreEqual(face, halfEdge.Face); Assert.AreEqual(mesh.BoundaryFaces[0], halfEdge.OppositeFace); } // Only real way to test the PreviousEdge is to debug and check that we use the // PreviousEdge stored in the HalfEdge rather than calculating by walking around // the face. var prevEdge = face.HalfEdge.PreviousEdge; Assert.AreEqual(prevEdge.NextVertex, face.HalfEdge.InitVertex); }
public void TestFaceCcw() { var mesh = new BndFactory(2).CreateMesh() as BndMesh; var face = BuildCcwSquare(mesh); // ReSharper disable once PossibleNullReferenceException mesh.FinalizeMesh(); Assert.IsTrue(face.IsCcw); }
public void TestPlacementDegenerate() { // Use mesh order for edges Placement.SetEdgeOrder(-1); var mesh = new BndFactory(2).CreateMesh() as BndMesh; // ReSharper disable PossibleNullReferenceException // ReSharper disable InconsistentNaming var ptLL = mesh.AddVertex(0, 0); var ptLR = mesh.AddVertex(1, 0); var ptUL = mesh.AddVertex(0, 1); var ptUR = mesh.AddVertex(1, 1); // ReSharper restore InconsistentNaming mesh.AddFace(ptLL, ptLR, ptUR, ptUL); mesh.FinalizeMesh(); var tree = Placement.GetPlacementTree(mesh); Assert.IsNotNull(tree.LocateFace((T)0.5, (T)0.5)); Assert.IsNull(tree.LocateFace((T)(-1), (T)0.5)); Assert.IsNull(tree.LocateFace((T)0.5, (T)(-1))); Assert.IsNull(tree.LocateFace((T)0.5, (T)3)); Assert.IsNull(tree.LocateFace((T)1.5, (T)0.5)); mesh = new BndFactory(2).CreateMesh() as BndMesh; ptLL = mesh.AddVertex(0, 0); ptLR = mesh.AddVertex(1, 0); ptUL = mesh.AddVertex(0, 1); ptUR = mesh.AddVertex(1, 1); var ul = mesh.AddFace(ptLL, ptUR, ptUL); var lr = mesh.AddFace(ptUR, ptLL, ptLR); mesh.FinalizeMesh(); tree = Placement.GetPlacementTree(mesh); Assert.AreEqual(tree.LocateFace((T)0.5, (T)0.75), ul); Assert.AreEqual(tree.LocateFace((T)0.5, (T)0.25), lr); // ReSharper restore PossibleNullReferenceException }
public void TestBuildAdjacentSquares() { var mesh = new BndFactory(2).CreateMesh() as BndMesh; var ptL0 = mesh.AddVertex(0, 0); var ptU0 = mesh.AddVertex(0, 1); var ptL1 = mesh.AddVertex(1, 0); var ptU1 = mesh.AddVertex(1, 1); var ptL2 = mesh.AddVertex(2, 0); var ptU2 = mesh.AddVertex(2, 1); var faceLeft = mesh.AddFace(ptL0, ptL1, ptU1, ptU0); var faceRight = mesh.AddFace(ptL1, ptL2, ptU2, ptU1); mesh.FinalizeMesh(); Assert.AreEqual(4, faceLeft.Edges().Count()); Assert.AreEqual(4, faceRight.Edges().Count()); Assert.AreEqual(14, mesh.HalfEdges.Count()); Assert.AreEqual(6, mesh.BoundaryFaces[0].Edges().Count()); }
public void TestCube() { var mesh = new BndFactory(3).CreateMesh() as BndMesh; var pt000 = mesh.AddVertex(0, 0, 0); var pt001 = mesh.AddVertex(0, 0, 1); var pt010 = mesh.AddVertex(0, 1, 0); var pt011 = mesh.AddVertex(0, 1, 1); var pt100 = mesh.AddVertex(1, 0, 0); var pt101 = mesh.AddVertex(1, 0, 1); var pt110 = mesh.AddVertex(1, 1, 0); var pt111 = mesh.AddVertex(1, 1, 1); var bottom = mesh.AddFace(pt000, pt100, pt110, pt010); var left = mesh.AddFace(pt000, pt010, pt011, pt001); var front = mesh.AddFace(pt000, pt001, pt101, pt100); var right = mesh.AddFace(pt100, pt101, pt111, pt110); var back = mesh.AddFace(pt010, pt110, pt111, pt011); var top = mesh.AddFace(pt001, pt011, pt111, pt101); mesh.FinalizeMesh(); Assert.AreEqual(4, bottom.Edges().Count()); Assert.AreEqual(4, top.Edges().Count()); Assert.AreEqual(4, left.Edges().Count()); Assert.AreEqual(4, right.Edges().Count()); Assert.AreEqual(4, front.Edges().Count()); Assert.AreEqual(4, back.Edges().Count()); Assert.AreEqual(0, mesh.BoundaryFaces.Count); Assert.AreEqual(6, mesh.Faces.Count()); Assert.AreEqual(8, mesh.Vertices.Count()); Assert.AreEqual(24, mesh.HalfEdges.Count()); foreach (var vtx in mesh.Vertices) { Assert.AreEqual(3, vtx.AdjacentEdges().Count()); Assert.AreEqual(3, vtx.AdjacentVertices().Count()); } }
public void TestSetOrientationTwoBnds() { var mesh = new BndFactory(2).CreateMesh() as BndMesh; var faceCcw = BuildCcwSquare(mesh) as BoundaryFace; var faceCw = BuildCwSquare(mesh) as BoundaryFace; // ReSharper disable PossibleNullReferenceException mesh.FinalizeMesh(); var vertsCcw = faceCcw.Vertices().ToList(); var vertsCw = faceCw.Vertices().ToList(); Assert.IsFalse(faceCcw.IsBoundary); Assert.IsFalse(faceCw.IsBoundary); Assert.IsTrue(faceCcw.Vertices().Zip(vertsCcw, (v1, v2) => v1 == v2).All(f => f)); Assert.IsTrue(faceCw.Vertices().Zip(vertsCw, (v1, v2) => v1 == v2).All(f => f)); mesh.SetOrientation(true); Assert.IsTrue(faceCcw.Vertices().Zip(vertsCcw, (v1, v2) => v1 == v2).All(f => f)); vertsCw = vertsCw.Skip(2).Concat(vertsCw.Take(2)).ToList(); Assert.IsTrue(faceCw.Vertices().Reverse().Zip(vertsCw, (v1, v2) => v1 == v2).All(f => f)); }