public void MonotoneSubdivisionAlgorithmConstructorTest()
        {
            // predefined polygon (which is extended)

            MonotoneSubdivisionAlgorithm algorithm = new MonotoneSubdivisionAlgorithm(_shell);

            Assert.AreEqual(_shell.Count + 1, algorithm.Shell.Count);
            Assert.IsTrue(_shell.SequenceEqual(algorithm.Shell.Take(_shell.Count)));
            Assert.AreEqual(algorithm.Shell[0], algorithm.Shell[algorithm.Shell.Count - 1]);

            // random polygon

            IBasicPolygon polygon = RandomPolygonGenerator.CreateRandomPolygon(100, new Coordinate(10, 10), new Coordinate(50, 50));

            algorithm = new MonotoneSubdivisionAlgorithm(polygon.Shell.Coordinates);

            Assert.IsTrue(polygon.Shell.SequenceEqual(algorithm.Shell));


            // exceptions

            Assert.IsTrue(polygon.Shell.SequenceEqual(algorithm.Shell));

            Assert.Throws <ArgumentNullException>(() => algorithm = new MonotoneSubdivisionAlgorithm(null));
        }
示例#2
0
        public void MonotoneSubdivisionTriangulateTest()
        {
            for (Int32 polygonNumber = 1; polygonNumber < 10; polygonNumber++)
            {
                IBasicPolygon polygon = RandomPolygonGenerator.CreateRandomPolygon(10 * polygonNumber, new Coordinate(10, 10), new Coordinate(50, 50));
                IReadOnlyList <Coordinate[]> triangles = MonotoneSubdivisionAlgorithm.Triangulate(polygon.Shell);

                triangles.Count.ShouldBe(polygon.Shell.Count - 3);

                foreach (Coordinate[] triangle in triangles)
                {
                    triangle.Length.ShouldBe(3);
                    triangle.ShouldBeSubsetOf(polygon.Shell);
                }
            }
        }
示例#3
0
        public void RandomPolygonGeneratorCreateRandomPolygonTest()
        {
            // check properties of generated polygons

            Int32      coordinateNumber = 10;
            Coordinate minCoordinate    = new Coordinate(10, 10);
            Coordinate maxCoordinate    = new Coordinate(20, 20);
            Double     convexityRatio   = 0.1;

            for (Int32 polygonNumber = 1; polygonNumber < 100; polygonNumber++)
            {
                IBasicPolygon randomPolygon = RandomPolygonGenerator.CreateRandomPolygon(coordinateNumber * polygonNumber, minCoordinate, maxCoordinate);

                Assert.AreEqual(coordinateNumber * polygonNumber + 1, randomPolygon.Shell.Count);            // number of coordinates
                Assert.AreEqual(Orientation.CounterClockwise, PolygonAlgorithms.Orientation(randomPolygon)); // orientation

                foreach (Coordinate coordinate in randomPolygon.Shell)
                {
                    Assert.True(coordinate.X > minCoordinate.X && coordinate.X <maxCoordinate.X &&
                                                                                coordinate.Y> minCoordinate.Y && coordinate.Y < maxCoordinate.Y); // all coordinates are located in the rectangle
                }

                Assert.IsFalse(ShamosHoeyAlgorithm.Intersects(randomPolygon.Shell)); // no intersection
            }

            // check convexity

            for (Int32 polygonNumber = 1; polygonNumber < 100; polygonNumber++)
            {
                Assert.IsTrue(PolygonAlgorithms.IsConvex(RandomPolygonGenerator.CreateRandomPolygon(coordinateNumber * polygonNumber, minCoordinate, maxCoordinate, 1)));
            }

            for (Int32 polygonNumber = 1; polygonNumber < 100; polygonNumber++)
            {
                Assert.IsFalse(PolygonAlgorithms.IsConvex(RandomPolygonGenerator.CreateRandomPolygon(coordinateNumber * polygonNumber, minCoordinate, maxCoordinate, 0)));
            }

            // check exceptions

            Assert.Throws <ArgumentOutOfRangeException>(() => RandomPolygonGenerator.CreateRandomPolygon(1, minCoordinate, maxCoordinate, convexityRatio));
            Assert.Throws <ArgumentOutOfRangeException>(() => RandomPolygonGenerator.CreateRandomPolygon(coordinateNumber, maxCoordinate, minCoordinate, convexityRatio));
            Assert.Throws <ArgumentOutOfRangeException>(() => RandomPolygonGenerator.CreateRandomPolygon(coordinateNumber, minCoordinate, maxCoordinate, -1));
        }
        public void MonotoneSubdivisionTriangulateTest()
        {
            for (Int32 polygonNumber = 1; polygonNumber < 10; polygonNumber++)
            {
                IBasicPolygon        polygon   = RandomPolygonGenerator.CreateRandomPolygon(10 * polygonNumber, new Coordinate(10, 10), new Coordinate(50, 50));
                IList <Coordinate[]> triangles = MonotoneSubdivisionAlgorithm.Triangulate(polygon.Shell.Coordinates);

                Assert.AreEqual(polygon.Shell.Count - 3, triangles.Count);

                foreach (Coordinate[] triangle in triangles)
                {
                    Assert.AreEqual(3, triangle.Length);

                    foreach (Coordinate coordinate in triangle)
                    {
                        Assert.IsTrue(polygon.Shell.Contains(coordinate));
                    }
                }
            }
        }
示例#5
0
        public void MonotoneSubdivisionAlgorithmConstructorTest()
        {
            // predefined polygon (which is extended)

            MonotoneSubdivisionAlgorithm algorithm = new MonotoneSubdivisionAlgorithm(this.source, null);

            algorithm.Source.Count().ShouldBe(this.source.Count + 1);
            algorithm.Source.Take(this.source.Count).ShouldBe(this.source);
            algorithm.Source.Last().ShouldBe(this.source[0]);

            // random polygon

            IBasicPolygon polygon = RandomPolygonGenerator.CreateRandomPolygon(100, new Coordinate(10, 10), new Coordinate(50, 50));

            algorithm = new MonotoneSubdivisionAlgorithm(polygon.Shell, null);

            algorithm.Source.ShouldBeSameAs(polygon.Shell);

            // exceptions

            Should.Throw <ArgumentNullException>(() => algorithm = new MonotoneSubdivisionAlgorithm(null, null));
        }