Пример #1
0
        public void HalfedgeGraphMergeGraphTest()
        {
            // graph A: merging two adjacent and one intersecting polygons
            _graph.MergePolygon(_factory.CreatePolygon(
                                    _factory.CreatePoint(0, 0),
                                    _factory.CreatePoint(8, 0),
                                    _factory.CreatePoint(8, 8),
                                    _factory.CreatePoint(0, 8)));
            _graph.MergePolygon(_factory.CreatePolygon(
                                    _factory.CreatePoint(8, 0),
                                    _factory.CreatePoint(14, 0),
                                    _factory.CreatePoint(8, 8)));
            _graph.MergePolygon(_factory.CreatePolygon(
                                    _factory.CreatePoint(-4, -6),
                                    _factory.CreatePoint(4, -6),
                                    _factory.CreatePoint(4, 2),
                                    _factory.CreatePoint(-4, 2)));

            _graph.VerifyTopology();
            Assert.AreEqual(4, _graph.Faces.Count());
            Assert.AreEqual(14, _graph.Edges.Count());
            Assert.AreEqual(28, _graph.Halfedges.Count());
            Assert.AreEqual(11, _graph.Vertices.Count());

            // graph B: two intersecting polygons
            HalfedgeGraph graphB = new HalfedgeGraph();

            graphB.MergePolygon(_factory.CreatePolygon(
                                    _factory.CreatePoint(-2, 6),
                                    _factory.CreatePoint(14, 6),
                                    _factory.CreatePoint(4, 14)));
            graphB.MergePolygon(_factory.CreatePolygon(
                                    _factory.CreatePoint(2, 1),
                                    _factory.CreatePoint(6, 1),
                                    _factory.CreatePoint(6, 13),
                                    _factory.CreatePoint(2, 13)));

            graphB.VerifyTopology();
            Assert.AreEqual(7, graphB.Faces.Count());
            Assert.AreEqual(19, graphB.Edges.Count());
            Assert.AreEqual(38, graphB.Halfedges.Count());
            Assert.AreEqual(13, graphB.Vertices.Count());

            // graph merge: numerous intersections
            _graph.MergeGraph(graphB);

            _graph.VerifyTopology();
            Assert.AreEqual(17, _graph.Faces.Count());
            Assert.AreEqual(47, _graph.Edges.Count());
            Assert.AreEqual(94, _graph.Halfedges.Count());
            Assert.AreEqual(31, _graph.Vertices.Count());
        }
Пример #2
0
        public void HalfedgeGraphMergeTest()
        {
            // merging two adjacent polygons

            _graph.MergePolygon(_factory.CreatePolygon(
                                    _factory.CreatePoint(0, 0),
                                    _factory.CreatePoint(10, 0),
                                    _factory.CreatePoint(10, 10),
                                    _factory.CreatePoint(0, 10)));
            _graph.MergePolygon(_factory.CreatePolygon(
                                    _factory.CreatePoint(10, 0),
                                    _factory.CreatePoint(15, -5),
                                    _factory.CreatePoint(25, 10),
                                    _factory.CreatePoint(20, 20),
                                    _factory.CreatePoint(10, 10)));

            _graph.VerifyTopology();
            Assert.AreEqual(2, _graph.Faces.Count());
            Assert.AreEqual(8, _graph.Edges.Count());
            Assert.AreEqual(16, _graph.Halfedges.Count());
            Assert.AreEqual(7, _graph.Vertices.Count());


            // adding two adjacent polygons and merging an intersecting one

            _graph.Clear();
            _graph.AddPolygon(_factory.CreatePolygon(
                                  _factory.CreatePoint(0, 0),
                                  _factory.CreatePoint(10, 0),
                                  _factory.CreatePoint(10, 10),
                                  _factory.CreatePoint(0, 10)));
            _graph.AddPolygon(_factory.CreatePolygon(
                                  _factory.CreatePoint(10, 0),
                                  _factory.CreatePoint(15, -5),
                                  _factory.CreatePoint(25, 10),
                                  _factory.CreatePoint(20, 20),
                                  _factory.CreatePoint(10, 10)));
            _graph.MergePolygon(_factory.CreatePolygon(
                                    _factory.CreatePoint(-3, 3),
                                    _factory.CreatePoint(3, 3),
                                    _factory.CreatePoint(3, 6),
                                    _factory.CreatePoint(-3, 6)));

            _graph.VerifyTopology();
            Assert.AreEqual(4, _graph.Faces.Count());
            Assert.AreEqual(16, _graph.Edges.Count());
            Assert.AreEqual(32, _graph.Halfedges.Count());
            Assert.AreEqual(13, _graph.Vertices.Count());

            var vertices = _graph.Vertices.Select(vertex => vertex.Position).ToArray();

            Assert.Contains(new Coordinate(0, 3), vertices);
            Assert.Contains(new Coordinate(0, 6), vertices);


            // merging two adjacent polygons and one intersecting both

            _graph.Clear();
            _graph.MergePolygon(_factory.CreatePolygon(
                                    _factory.CreatePoint(0, 0),
                                    _factory.CreatePoint(10, 0),
                                    _factory.CreatePoint(10, 10),
                                    _factory.CreatePoint(0, 10)));
            _graph.MergePolygon(_factory.CreatePolygon(
                                    _factory.CreatePoint(10, 0),
                                    _factory.CreatePoint(15, -5),
                                    _factory.CreatePoint(25, 10),
                                    _factory.CreatePoint(20, 20),
                                    _factory.CreatePoint(10, 10)));
            _graph.MergePolygon(_factory.CreatePolygon(
                                    _factory.CreatePoint(-3, 3),
                                    _factory.CreatePoint(30, 3),
                                    _factory.CreatePoint(30, 6),
                                    _factory.CreatePoint(-3, 6)));

            _graph.VerifyTopology();
            Assert.AreEqual(8, _graph.Faces.Count());
            Assert.AreEqual(24, _graph.Edges.Count());
            Assert.AreEqual(48, _graph.Halfedges.Count());
            Assert.AreEqual(17, _graph.Vertices.Count());

            Assert.AreEqual(5, _graph.Vertices.Count(vertex => vertex.Position.Y == 3));
            Assert.AreEqual(5, _graph.Vertices.Count(vertex => vertex.Position.Y == 6));


            // merging four adjacent polygons

            _graph.Clear();
            _graph.MergePolygon(_factory.CreatePolygon(
                                    _factory.CreatePoint(0, 0),
                                    _factory.CreatePoint(1, 0),
                                    _factory.CreatePoint(1, 2),
                                    _factory.CreatePoint(0, 2)));
            _graph.MergePolygon(_factory.CreatePolygon(
                                    _factory.CreatePoint(1, 0),
                                    _factory.CreatePoint(2, 0),
                                    _factory.CreatePoint(2, 1),
                                    _factory.CreatePoint(1, 1)));
            _graph.MergePolygon(_factory.CreatePolygon(
                                    _factory.CreatePoint(2, 0),
                                    _factory.CreatePoint(3, 0),
                                    _factory.CreatePoint(3, 2),
                                    _factory.CreatePoint(2, 2)));
            _graph.MergePolygon(_factory.CreatePolygon(
                                    _factory.CreatePoint(1, 1),
                                    _factory.CreatePoint(2, 1),
                                    _factory.CreatePoint(1, 2)));

            _graph.VerifyTopology();
            Assert.AreEqual(4, _graph.Faces.Count());
            Assert.AreEqual(13, _graph.Edges.Count());
            Assert.AreEqual(26, _graph.Halfedges.Count());
            Assert.AreEqual(10, _graph.Vertices.Count());

            Assert.AreEqual(2, _graph.Faces.Count(face => face.Vertices.Count() == 5 && face.Edges.Count() == 5));
            Assert.AreEqual(1, _graph.Faces.Count(face => face.Vertices.Count() == 4 && face.Edges.Count() == 4));
            Assert.AreEqual(1, _graph.Faces.Count(face => face.Vertices.Count() == 3 && face.Edges.Count() == 3));


            // merging two adjacent and two intersecting polygons

            _graph.Clear();
            _graph.MergePolygon(_factory.CreatePolygon(
                                    _factory.CreatePoint(0, 0),
                                    _factory.CreatePoint(8, 0),
                                    _factory.CreatePoint(8, 8),
                                    _factory.CreatePoint(0, 8)));
            _graph.MergePolygon(_factory.CreatePolygon(
                                    _factory.CreatePoint(8, 0),
                                    _factory.CreatePoint(14, 0),
                                    _factory.CreatePoint(8, 8)));

            _graph.MergePolygon(_factory.CreatePolygon(
                                    _factory.CreatePoint(-4, -6),
                                    _factory.CreatePoint(4, -6),
                                    _factory.CreatePoint(4, 2),
                                    _factory.CreatePoint(-4, 2)));

            _graph.VerifyTopology();
            Assert.AreEqual(4, _graph.Faces.Count());
            Assert.AreEqual(14, _graph.Edges.Count());
            Assert.AreEqual(28, _graph.Halfedges.Count());
            Assert.AreEqual(11, _graph.Vertices.Count());

            _graph.MergePolygon(_factory.CreatePolygon(
                                    _factory.CreatePoint(2, 1),
                                    _factory.CreatePoint(6, 1),
                                    _factory.CreatePoint(6, 13),
                                    _factory.CreatePoint(2, 13)));

            _graph.VerifyTopology();
            Assert.AreEqual(8, _graph.Faces.Count());
            Assert.AreEqual(26, _graph.Edges.Count());
            Assert.AreEqual(52, _graph.Halfedges.Count());
            Assert.AreEqual(19, _graph.Vertices.Count());


            // merging two adjacent polygons with one intersecting / touching them

            _graph.Clear();
            _graph.AddPolygon(_factory.CreatePolygon(
                                  _factory.CreatePoint(0, 0),
                                  _factory.CreatePoint(10, 0),
                                  _factory.CreatePoint(10, 10),
                                  _factory.CreatePoint(0, 10)));
            _graph.AddPolygon(_factory.CreatePolygon(
                                  _factory.CreatePoint(0, 10),
                                  _factory.CreatePoint(10, 10),
                                  _factory.CreatePoint(10, 20),
                                  _factory.CreatePoint(0, 20)));
            _graph.MergePolygon(_factory.CreatePolygon(
                                    _factory.CreatePoint(5, 5),
                                    _factory.CreatePoint(15, 5),
                                    _factory.CreatePoint(15, 10),
                                    _factory.CreatePoint(5, 10)));

            _graph.VerifyTopology();
            Assert.AreEqual(4, _graph.Faces.Count());
            Assert.AreEqual(14, _graph.Edges.Count());
            Assert.AreEqual(28, _graph.Halfedges.Count());
            Assert.AreEqual(11, _graph.Vertices.Count());

            Assert.AreEqual(1, _graph.Faces.Count(face => face.Vertices.Count() == 6 && face.Edges.Count() == 6));
            Assert.AreEqual(1, _graph.Faces.Count(face => face.Vertices.Count() == 5 && face.Edges.Count() == 5));
            Assert.AreEqual(2, _graph.Faces.Count(face => face.Vertices.Count() == 4 && face.Edges.Count() == 4));
        }