def testMinTriangle(self): points = randomConvexPolygon(10, k=20).points interior = minTriangle(points) exterior = boundingTriangle(points) # Plot points plotPoints(points, style='ro') # Plot bounding triangle plot(interior, style='go-') show(exterior, style='bo-')
def testExterior(self): n = 100 k = 1000 poly = randomConvexPolygon(n, k=50) points = [poly.exteriorPoint() for i in range(k)] for point in points: self.assertTrue(not poly.contains(point)) if self.ANIMATE: plot(poly) showPoints(points, style='ro')
def testConcaveSplit(self): poly = randomConvexPolygon(20, k=20) polygons = set([poly]) for t in range(10): poly = polygons.pop() poly1, poly2 = poly.split(INTERIOR=True) polygons.add(poly1) polygons.add(poly2) show(list(polygons))
def testConvex(self): n = 100 poly = randomConvexPolygon(n, k=50) self.assertTrue(poly.isConvex()) p1, p2 = poly.split() c1, c2 = (p1.isConvex(), p2.isConvex()) self.assertTrue(c1 and c2) p1, p2 = poly.split(INTERIOR=True) c1, c2 = (p1.isConvex(), p2.isConvex()) self.assertTrue((c1 and not c2) or (c2 and not c1))
def testConcavePolygons(self): initial = randomConvexPolygon(200, k=100) convex = set([initial]) concave = set([]) numConvex = 10 for i in range(numConvex): polygon = convex.pop() for p in polygon.split(INTERIOR=True): if p.isConvex(): convex.add(p) else: concave.add(p) regions = list(convex.union(concave)) self.runLocator(regions)
def testRandomConvexPolygons(self): initial = randomConvexPolygon(200, k=100) polygons = set([initial]) # Can't split triangles, remove from contention triangles = set([]) for i in range(10): if not polygons: break # Remove, split random polygon polygon = polygons.pop() for polygon in polygon.split(): if polygon.n == 3: triangles.add(polygon) else: polygons.add(polygon) polygons.update(triangles) # Run Kirkpatrick's polygons = list(polygons) self.runLocator(polygons)
x = A.x + factor * bisector[0] y = A.y + factor * bisector[1] def absRound(n): if n < 0: return floor(n) return ceil(n) x = absRound(x) y = absRound(y) return Point(x, y) def adjust(i): A = poly.points[i % poly.n] B = poly.points[(i - 1) % poly.n] C = poly.points[(i + 1) % poly.n] return bisect(A, B, C) expanded_points = [adjust(i) for i in range(poly.n)] return Polygon(expanded_points) return expand(minTriangle(Polygon(points))) if __name__ == "__main__": poly = randomConvexPolygon(10) triangle = minTriangle(poly) plot(poly) show(triangle, style='r--')
def testSplit(self): poly = randomConvexPolygon(20, k=20) show(poly) p1, p2 = poly.split() show([p1, p2])
def testRandomConcavePolygons(self): initial = randomConvexPolygon(100, k=100) polygons = randomConcaveTiling(initial) self.runLocator(polygons)
def testRandomTriangles(self): poly = randomConvexPolygon(50) regions = triangulatePolygon(poly) self.runLocator(regions)