Beispiel #1
0
        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");
        }
Beispiel #2
0
        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));
        }
Beispiel #3
0
        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));
        }
Beispiel #4
0
        public void TestWrongOrdering()
        {
            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);

            mesh.AddFace(ptL0, ptL1, ptU1, ptU0);
            var failed = false;

            try
            {
                // This vertex order is inconsistent with the first face added and should cause a failure
                mesh.AddFace(ptL1, ptU1, ptU2, ptL2);
            }
            catch (MeshNavException)
            {
                failed = true;
            }
            Assert.IsTrue(failed);
        }
Beispiel #5
0
        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);
        }
Beispiel #6
0
        public void TestImportObjFile()
        {
            var factory = new BndFactory(3);
            var meshes  = Import.ImportMesh(factory, "teapot.obj");

            Assert.AreEqual(meshes.Count, 1);
        }
Beispiel #7
0
        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);
        }
Beispiel #8
0
        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
        }
Beispiel #9
0
        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());
        }
Beispiel #10
0
        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());
            }
        }
Beispiel #11
0
        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));
        }