private static void TestAddAndSubtract(int size1, int offsetX, int offsetY, int size2, BlobCollection blobs, int addArea, int subArea, bool testOpen, bool cornersOnly) { if (!testOpen) { SectorConstrainedOSMAreaGraph square1 = MakeRect(blobs.nodes, 0, 0, size1, size1, cornersOnly); SectorConstrainedOSMAreaGraph square2 = MakeRect(blobs.nodes, offsetX, offsetY, offsetX + size2, offsetY + size2, cornersOnly); var blobs2 = Clone(blobs); // clone since we modify blobs now //if (square1.Clone().Add(square2, blobs).Area(blobs) != addArea) throw new NotImplementedException(); //if (square1.Clone().Subtract(square2, blobs).Area(blobs) != subArea) throw new NotImplementedException(); double area1 = GetArea(square1.Clone().Add(square2, blobs).Finalize(blobs).GetTesselationVertices(Color.White)); double area2 = GetArea(square1.Clone().Subtract(square2, blobs2).Finalize(blobs2).GetTesselationVertices(Color.White)); if (area1 != addArea) { throw new NotImplementedException(); } if (area2 != subArea) { throw new NotImplementedException(); } } else { // test some coastline stuff SectorConstrainedOSMAreaGraph square1 = MakeOpenRect(blobs.nodes, 0, 0, size1, size1, true, cornersOnly); // leave left open SectorConstrainedOSMAreaGraph square2 = MakeOpenRect(blobs.nodes, offsetX, offsetY, offsetX + size2, offsetY + size2, false, cornersOnly); // leave right open var blobs2 = Clone(blobs); // clone since we modify blobs now double area1 = GetArea(square1.Clone().Add(square2, blobs).Finalize(blobs).GetTesselationVertices(Color.White)); double area2 = GetArea(square1.Clone().Subtract(square2, blobs2).Finalize(blobs2).GetTesselationVertices(Color.White)); if (area1 != addArea) { throw new NotImplementedException(); } if (area2 != subArea) { throw new NotImplementedException(); } } }
private void ToughTest() { var blobs = new BlobCollection(); SectorConstrainedOSMAreaGraph coast = new SectorConstrainedOSMAreaGraph(); AddLineSeg(blobs.nodes, coast, 6, 6, 6, 5); AddLineSeg(blobs.nodes, coast, 6, 5, 6, 4); AddLineSeg(blobs.nodes, coast, 6, 4, 6, 3); AddLineSeg(blobs.nodes, coast, 6, 3, 5, 2); AddLineSeg(blobs.nodes, coast, 5, 2, 3, 2); AddLineSeg(blobs.nodes, coast, 3, 2, 2, 2); AddLineSeg(blobs.nodes, coast, 2, 2, 1, 2); MarkStartPoint(coast, 6, 6); MarkEndPoint(coast, 1, 2); SectorConstrainedOSMAreaGraph bigLake = new SectorConstrainedOSMAreaGraph(); AddLineSeg(blobs.nodes, bigLake, 7, 0, 3, 0); AddLineSeg(blobs.nodes, bigLake, 3, 0, 3, 1); AddLineSeg(blobs.nodes, bigLake, 3, 1, 4, 1); AddLineSeg(blobs.nodes, bigLake, 4, 1, 5, 2); AddLineSeg(blobs.nodes, bigLake, 5, 2, 6, 3); AddLineSeg(blobs.nodes, bigLake, 6, 3, 6, 4); AddLineSeg(blobs.nodes, bigLake, 6, 4, 6, 5); AddLineSeg(blobs.nodes, bigLake, 6, 5, 7, 5); AddLineSeg(blobs.nodes, bigLake, 7, 5, 7, 0); SectorConstrainedOSMAreaGraph smallLake = new SectorConstrainedOSMAreaGraph(); AddLineSeg(blobs.nodes, smallLake, 2, 1, 2, 2); AddLineSeg(blobs.nodes, smallLake, 2, 2, 3, 2); AddLineSeg(blobs.nodes, smallLake, 3, 2, 5, 4); AddLineSeg(blobs.nodes, smallLake, 5, 4, 6, 4); AddLineSeg(blobs.nodes, smallLake, 6, 4, 3, 1); AddLineSeg(blobs.nodes, smallLake, 3, 1, 2, 1); double coastArea = GetArea(coast.Finalize(blobs).GetTesselationVertices(Color.White)); if (coastArea != 19.5 - 10) { throw new NotImplementedException(); // sure, minus 10 because everything's scaled up and we can't properly close } double bigLakeArea = GetArea(bigLake.Finalize(blobs).GetTesselationVertices(Color.White)); if (bigLakeArea != 10) { throw new NotImplementedException(); } double smallLakeArea = GetArea(smallLake.Finalize(blobs).GetTesselationVertices(Color.White)); if (smallLakeArea != 3.5) { throw new NotImplementedException(); } var lakes = bigLake.Clone().Add(smallLake, blobs); double lakesArea = GetArea(lakes.Finalize(blobs).GetTesselationVertices(Color.White)); // if (lakesArea != 13.5) throw new NotImplementedException(); // looks like the tesselator is filling in the hole? var final = coast.Clone().Subtract(lakes, blobs); double finalArea = GetArea(final.Finalize(blobs).GetTesselationVertices(Color.White)); if (finalArea != 17.5 - 10) { throw new NotImplementedException(); // sure, minus 10 because everything's scaled up and we can't properly close } }