Beispiel #1
0
        public void SplitEdge_ShouldWorkOnSimpleQuad()
        {
            // Arrange
            var positions = new[]
            {
                new Vec3d(0, 0, 0),
                new Vec3d(1, 0, 0),
                new Vec3d(1, 1, 0),
                new Vec3d(0, 1, 0),
            };
            var rand = new Random();

            Mesh.Core.Mesh mesh = null;

            for (int i = 0; i < 100; i++)
            {
                mesh = Mesh.Core.Mesh.CreateSingleFace(positions);

                // Act
                var index = rand.Next(0, 4);
                var param = rand.Next(2, 8) / 10.0;
                mesh.SplitEdge(index, param, out _);

                // Assert
                Assert.AreEqual(1, mesh.FaceCount);
                Assert.AreEqual(5, mesh.VertexCount);
                Assert.AreEqual(10, mesh.HalfEdgeCount);
            }

            SimpleExporter.Export("D:\\Git\\PolygonMesh\\PolygonMesh.Library.Tests\\Resources\\test.obj", mesh);
        }
Beispiel #2
0
        public void SplitFace_And_CollapseEdge_Are_Inverse()
        {
            // Arrange
            var positions = new[]
            {
                new Vec3d(0, 0, 0),
                new Vec3d(1, 0, 0),
                new Vec3d(1, 1, 0),
                new Vec3d(0, 1, 0),
            };
            var rand = new Random();

            Mesh.Core.Mesh mesh = null;

            for (int i = 0; i < 4; i++)
            {
                mesh = Mesh.Core.Mesh.CreateSingleFace(positions);

                // Act
                var index = rand.Next(0, 4);
                mesh.SplitFace(0, index, (index + 2) % 4, out _);
                mesh.CollapseEdge(1, 2);

                // Assert
                Assert.AreEqual(1, mesh.FaceCount);
                Assert.AreEqual(4, mesh.VertexCount);
                Assert.AreEqual(8, mesh.HalfEdgeCount);
            }
        }
Beispiel #3
0
        public void CollapseEdge_Should_Work_On_Simple_Quad() // How would a collapsed edge on a quad look like?
        {
            // Arrange
            var positions = new[]
            {
                new Vec3d(0, 0, 0),
                new Vec3d(1, 0, 0),
                new Vec3d(1, 1, 0),
                new Vec3d(0, 1, 0),
            };
            var rand = new Random();

            Mesh.Core.Mesh mesh = null;

            for (int i = 0; i < 4; i++)
            {
                mesh = Mesh.Core.Mesh.CreateSingleFace(positions);

                // Act
                var index = rand.Next(0, 4);
                mesh.CollapseEdge(0, index);

                // Assert
                Assert.AreEqual(1, mesh.FaceCount);
                Assert.AreEqual(3, mesh.VertexCount);
                Assert.AreEqual(6, mesh.HalfEdgeCount);
            }

            SimpleExporter.Export("D:\\Git\\PolygonMesh\\PolygonMesh.Library.Tests\\Resources\\test.obj", mesh);
        }
Beispiel #4
0
        public void Faces_Cannot_Have_2_Vertices()
        {
            // initialice
            var mesh = new Mesh.Core.Mesh();
            Func <Vec3d, Vec3d, bool> addLineFaceSucceeds = (v0, v1) =>
            {
                mesh.AddFace(new[] { v0, v1 });
                return(mesh.FaceCount == 0);
            };

            Prop.ForAll(addLineFaceSucceeds).QuickCheckThrowOnFailure();
        }
Beispiel #5
0
        public void Faces_Cannot_Have_1_Vertex()
        {
            // initialize
            var mesh = new Mesh.Core.Mesh();
            Func <Vec3d, bool> addSingularFaceSucceeds = v =>
            {
                mesh.AddFace(new[] { v });
                return(mesh.FaceCount == 0);
            };

            Prop.ForAll(addSingularFaceSucceeds).QuickCheckThrowOnFailure();
        }
Beispiel #6
0
        public void SplitFace_And_SplitEdge_Together_Can_Create_Complex_Mesh()
        {
            // building the mesh from this: https://w3.cs.jmu.edu/bowersjc/page/courses/spring17/cs480/labs/images/final_dcel.png

            // Arrange
            var positions = new[]
            {
                new Vec3d(0, 0, 0),
                new Vec3d(2, 0, 0),
                new Vec3d(2, 1, 0),
                new Vec3d(0, 1, 0),
            };

            Mesh.Core.Mesh mesh = Mesh.Core.Mesh.CreateSingleFace(positions);

            // Act
            // split in half
            mesh.SplitEdge(0, 0, 0.5, out var firstEdgeIndices);
            mesh.SplitEdge(0, 3, 0.5, out var secondEdgeIndices);
            mesh.SplitFace(0, firstEdgeIndices.Item2, secondEdgeIndices.Item2, out _);

            // split right quad in two triangles
            mesh.SplitFace(0, 0, 2, out _);

            // split left quad in three triangles
            mesh.SplitEdge(1, 0, 0.5, out firstEdgeIndices);
            mesh.SplitFace(1, firstEdgeIndices.Item2, 3, out var facePartIndices);
            mesh.SplitFace(facePartIndices.Item2, 1, 3, out facePartIndices);

            // split middle triangle of split left quad in half
            mesh.SplitEdge(facePartIndices.Item2, 0, 0.5, out firstEdgeIndices);
            mesh.SplitEdge(facePartIndices.Item2, 3, 0.5, out secondEdgeIndices);
            mesh.SplitFace(facePartIndices.Item2, firstEdgeIndices.Item2, secondEdgeIndices.Item2, out facePartIndices);

            // split lower quad of split triangle in half
            mesh.SplitEdge(facePartIndices.Item1, 0, 0.5, out firstEdgeIndices);
            mesh.SplitEdge(facePartIndices.Item1, 3, 0.5, out secondEdgeIndices);
            mesh.SplitFace(facePartIndices.Item1, firstEdgeIndices.Item2, secondEdgeIndices.Item2, out _);

            // Assert
            Assert.AreEqual(11, mesh.VertexCount);
            Assert.AreEqual(7, mesh.FaceCount);
            Assert.AreEqual(38, mesh.HalfEdgeCount); // i think it should be 34 instead
            SimpleExporter.Export("D:\\Git\\PolygonMesh\\PolygonMesh.Library.Tests\\Resources\\test.obj", mesh);
        }
Beispiel #7
0
        public void proptest_test()
        {
            //        (Vec3d(X: 0, Y: -1.7976931348623157E+308, Z: 0), Vec3d(X: ∞, Y: 5E-324, Z: -0),
            //          Vec3d(X: NaN, Y: 0, Z: 0))

            var mesh      = new Mesh.Core.Mesh();
            var positions = new[] {
                new Vec3d(0, -1.7976931348623157E+308, -0),
                new Vec3d(double.PositiveInfinity, 5E-324, -0),
                new Vec3d(double.NaN, 0, 0)
            };

            var success = mesh.AddFace(positions);

            var tryAgain = mesh.AddFace(positions);

            Assert.IsTrue(true);
        }
Beispiel #8
0
        public void Faces_Cannot_Be_Added_Twice() // Fails because not implemented
        {
            // initialize
            Func <Vec3d, Vec3d, Vec3d, bool> addFaceTwiceSucceeds = (v0, v1, v2) =>
            {
                var mesh = new Mesh.Core.Mesh();

                if (!mesh.AddFace(new[] { v0, v1, v2 }))
                {
                    return(true);
                }

                mesh.AddFace(new[] { v0, v1, v2 });

                return(mesh.FaceCount == 1);
            };

            Prop.ForAll(addFaceTwiceSucceeds).QuickCheckThrowOnFailure();
        }
Beispiel #9
0
        public void Kis_Should_Work_On_Simple_Quad()
        {
            // Arrange
            var positions = new[]
            {
                new Vec3d(0, 0, 0),
                new Vec3d(1, 0, 0),
                new Vec3d(1, 1, 0),
                new Vec3d(0, 1, 0),
            };

            Mesh.Core.Mesh mesh = Mesh.Core.Mesh.CreateSingleFace(positions);

            // Act
            mesh.Kis();

            // Assert
            Assert.AreEqual(5, mesh.VertexCount);
            Assert.AreEqual(4, mesh.FaceCount);
            Assert.AreEqual(16, mesh.HalfEdgeCount);
            SimpleExporter.Export("D:\\Git\\PolygonMesh\\PolygonMesh.Library.Tests\\Resources\\test.obj", mesh);
        }
Beispiel #10
0
        public void SplitFace_And_SplitEdge_Together_Can_Turn_Simple_Quad_Into_Two_Rectangles()
        {
            // Arrange
            var positions = new[]
            {
                new Vec3d(0, 0, 0),
                new Vec3d(1, 0, 0),
                new Vec3d(1, 1, 0),
                new Vec3d(0, 1, 0),
            };

            Mesh.Core.Mesh mesh = Mesh.Core.Mesh.CreateSingleFace(positions);

            // Act
            mesh.SplitEdge(0, 0, 0.5, out _);
            mesh.SplitEdge(0, 3, 0.5, out _);
            mesh.SplitFace(0, 1, 4, out _);

            // Assert
            //Assert.AreEqual(6, mesh.VertexCount);
            //Assert.AreEqual(14, mesh.HalfEdgeCount);
            //Assert.AreEqual(2, mesh.FaceCount);
            SimpleExporter.Export("D:\\Git\\PolygonMesh\\PolygonMesh.Library.Tests\\Resources\\test.obj", mesh);
        }