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"); }
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"); }
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"); }
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"); } } } }
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"); } }
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"); }
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"); }