コード例 #1
0
        public void MetoriteSiteTest()
        {
            var result   = Rectify.GetRectNodes(TestData.MeteorStrike(), DataLayout.CodeInitializedArray);
            var output   = Rectify.TraverseShapeOutlines(result);
            var polygons = Rectify.FindVertsFromEdges(output);

            var subpolygons = Rectify.FirstLevelDecomposition(polygons[0]);

            Assert.AreEqual(1, subpolygons.Count, "Didn't get 1 subpolygon as expected");
            List <RectShape> subsubPolygons = ValidateRects(subpolygons);

            Assert.AreEqual(8, subsubPolygons.Count, "Did not decomp into the minimum 8 polygons");
        }
コード例 #2
0
        public void HoleSelfCutWithCogridCompanionTest()
        {
            var result   = Rectify.GetRectNodes(TestData.SelfHoleCutWithCogridSide(), DataLayout.CodeInitializedArray);
            var output   = Rectify.TraverseShapeOutlines(result);
            var polygons = Rectify.FindVertsFromEdges(output);

            var subpolygons = Rectify.FirstLevelDecomposition(polygons[1]);

            Assert.AreEqual(2, subpolygons.Count, "Didn't get 2 subpolygon as expected");
            List <RectShape> subsubPolygons = ValidateRects(subpolygons);

            Assert.AreEqual(6, subsubPolygons.Count, "Did not decomp into the minimum 6 polygons");
        }
コード例 #3
0
        public void DisjointHatTest()
        {
            var result   = Rectify.GetRectNodes(TestData.DisjointHat(), DataLayout.CodeInitializedArray);
            var output   = Rectify.TraverseShapeOutlines(result);
            var polygons = Rectify.FindVertsFromEdges(output);

            var subpolygons = Rectify.FirstLevelDecomposition(polygons[0]);

            Assert.AreEqual(3, subpolygons.Count, "Didn't get 3 subpolygon as expected");
            Assert.AreEqual(4, subpolygons[0].Vertices.Count, "Had wrong number of vertices for main square");
            List <RectShape> subsubPolygons = ValidateRects(subpolygons);

            Assert.AreEqual(8, subsubPolygons.Count, "Did not decomp into the minimum 8 polygons");
        }
コード例 #4
0
        public void BinaryConcaveShapeNoHolesPickChordsTest()
        {
            var result   = Rectify.GetRectNodes(TestData.BinaryConcaveShapeNoHoles(), DataLayout.CodeInitializedArray);
            var output   = Rectify.TraverseShapeOutlines(result);
            var polygons = Rectify.FindVertsFromEdges(output);

            var subpolygons = Rectify.FirstLevelDecomposition(polygons[1]);

            Assert.AreEqual(4, subpolygons.Count, "Didn't get 4 subpolygons as expected");
            Assert.AreEqual(8, subpolygons[0].Vertices.Count, "Had wrong number of vertices for bottom stair-step shape");
            Assert.AreEqual(4, subpolygons[2].Vertices.Count, "Had wrong number of vertices for bottom middle thin shape");
            Assert.AreEqual(6, subpolygons[1].Vertices.Count, "Had wrong number of vertices for top bent shape");
            Assert.AreEqual(4, subpolygons[3].Vertices.Count, "Had wrong number of vertices for squarish shape");

            //perimeters are traversable.
            foreach (var sp in subpolygons)
            {
                bool     cycled = false;
                RectEdge start  = sp.Perimeter[0];
                RectEdge next   = start.Next;
                for (int i = 0; i < 999; i++)
                {
                    if (next == start)
                    {
                        cycled = true;
                        break;
                    }
                    next = next.Next;
                }
                if (cycled == false)
                {
                    Assert.Fail("Perimeter did not cycle");
                }

                foreach (RectEdge re in sp.Perimeter)
                {
                    Position p = re.SecondPosition - re.Next.FirstPosition;
                    if (p.Magnitude != 0)
                    {
                        Assert.Fail("Two edges were not end-to-end");
                    }
                    Position q = re.FirstPosition - re.Next.FirstPosition;
                    if (q.Magnitude != 1)
                    {
                        Assert.Fail("Two edges were further than 1 apart");
                    }
                }
            }
        }
コード例 #5
0
        public void ExciseHoleTest()
        {
            var result   = Rectify.GetRectNodes(TestData.ExcisedHoleIsland(), DataLayout.CodeInitializedArray);
            var output   = Rectify.TraverseShapeOutlines(result);
            var polygons = Rectify.FindVertsFromEdges(output);

            var subpolygons = new List <RectShape>();

            foreach (var p in polygons)
            {
                subpolygons.AddRange(Rectify.FirstLevelDecomposition(p));
            }

            foreach (RectShape rs in subpolygons)
            {
                Assert.IsTrue(rs.Holes.Count < 2, "Did not get less than 2 holes as expected");
            }
        }
コード例 #6
0
        public void BinaryConcaveShapeNoHolesSecondLevelDecompTest()
        {
            var result   = Rectify.GetRectNodes(TestData.BinaryConcaveShapeNoHoles(), DataLayout.CodeInitializedArray);
            var output   = Rectify.TraverseShapeOutlines(result);
            var polygons = Rectify.FindVertsFromEdges(output);

            var subpolygons = Rectify.FirstLevelDecomposition(polygons[1]);

            var subsubPolygons = new List <RectShape>();

            foreach (var sp in subpolygons)
            {
                subsubPolygons.AddRange(Rectify.SecondLevelDecomposition(sp));
            }

            Assert.AreEqual(7, subsubPolygons.Count, "Did not decomp into the minimum 7 polygons");

            foreach (RectShape rs in subsubPolygons)
            {
                Assert.AreEqual(4, rs.Vertices.Count, "2nd level decomp with > 4 verts");
            }

            //Assert.AreEqual(8, subpolygons[0].Vertices.Count, "Had wrong number of vertices for bottom stair-step shape");
            //Assert.AreEqual(4, subpolygons[1].Vertices.Count, "Had wrong number of vertices for bottom middle thin shape");
            //Assert.AreEqual(6, subpolygons[2].Vertices.Count, "Had wrong number of vertices for top bent shape");
            //Assert.AreEqual(4, subpolygons[3].Vertices.Count, "Had wrong number of vertices for squarish shape");

            //bottom stair step shape decomps
            Assert.AreEqual(14, subsubPolygons[0].Perimeter.Count, "Had wrong perimeter east-most bottom shape");
            Assert.AreEqual(6, subsubPolygons[1].Perimeter.Count, "Had wrong perimeter middle bottom shape");
            Assert.AreEqual(18, subsubPolygons[2].Perimeter.Count, "Had wrong perimeter west-most bottom shape");

            //bottom middle thin shape
            Assert.AreEqual(22, subsubPolygons[6].Perimeter.Count, "Had wrong perimeter for bottom middle thin shape");

            //top bent shape
            //I wonder if these are swapping b/c Find is non deterministic?
            Assert.AreEqual(12, subsubPolygons[3].Perimeter.Count, "Had wrong perimeter for top-most top shape");
            Assert.AreEqual(6, subsubPolygons[4].Perimeter.Count, "Had wrong perimeter for west-most top shape");

            //squarish shape
            Assert.AreEqual(24, subsubPolygons[5].Perimeter.Count, "Had wrong perimeter for squarsh shape");
        }
コード例 #7
0
        public void OneDRectangleVertexTest()
        {
            var result   = Rectify.GetRectNodes(TestData.OneDRectangleTest(), DataLayout.CodeInitializedArray);
            var output   = Rectify.TraverseShapeOutlines(result);
            var polygons = Rectify.FindVertsFromEdges(output);

            var subpolygons = Rectify.FirstLevelDecomposition(polygons[0]);

            Assert.AreEqual(1, subpolygons.Count, "Didn't get 1 subpolygon as expected");
            Assert.AreEqual(4, subpolygons[0].Vertices.Count, "Had wrong number of vertices for main square");

            //perimeters are traversable.
            foreach (var sp in subpolygons)
            {
                bool     cycled = false;
                RectEdge start  = sp.Perimeter[0];
                RectEdge next   = start.Next;
                for (int i = 0; i < 999; i++)
                {
                    if (next == start)
                    {
                        cycled = true;
                        break;
                    }
                    next = next.Next;
                }
                if (cycled == false)
                {
                    Assert.Fail("Perimeter did not cycle");
                }

                foreach (RectEdge re in sp.Perimeter)
                {
                    Position p = re.SecondPosition - re.Next.FirstPosition;
                    if (p.Magnitude != 0)
                    {
                        Assert.Fail("Two edges were not end-to-end");
                    }
                    Position q = re.FirstPosition - re.Next.FirstPosition;
                    if (q.Magnitude != 1)
                    {
                        Assert.Fail("Two edges were further than 1 apart");
                    }
                }
            }

            var subsubPolygons = new List <RectShape>();

            foreach (var sp in subpolygons)
            {
                subsubPolygons.AddRange(Rectify.SecondLevelDecomposition(sp));
            }

            //perimeters are traversable.
            foreach (var sp in subsubPolygons)
            {
                bool     cycled = false;
                RectEdge start  = sp.Perimeter[0];
                RectEdge next   = start.Next;
                for (int i = 0; i < 999; i++)
                {
                    if (next == start)
                    {
                        cycled = true;
                        break;
                    }
                    next = next.Next;
                }
                if (cycled == false)
                {
                    Assert.Fail("Perimeter did not cycle");
                }

                foreach (RectEdge re in sp.Perimeter)
                {
                    Position p = re.SecondPosition - re.Next.FirstPosition;
                    if (p.Magnitude != 0)
                    {
                        Assert.Fail("Two edges were not end-to-end");
                    }
                    Position q = re.FirstPosition - re.Next.FirstPosition;
                    if (q.Magnitude != 1)
                    {
                        Assert.Fail("Two edges were further than 1 apart");
                    }
                }

                Assert.IsTrue(sp.Vertices.Count == 4, "Not a rectangle, had more than 4 verts");
            }

            Assert.AreEqual(4, subsubPolygons.Count, "Did not decomp into the minimum 4 polygons");
        }