Beispiel #1
0
    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-')
Beispiel #2
0
    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')
Beispiel #3
0
    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))
Beispiel #4
0
    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))
Beispiel #5
0
    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)
Beispiel #6
0
    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--')
Beispiel #8
0
    def testSplit(self):
        poly = randomConvexPolygon(20, k=20)
        show(poly)

        p1, p2 = poly.split()
        show([p1, p2])
Beispiel #9
0
 def testRandomConcavePolygons(self):
     initial = randomConvexPolygon(100, k=100)
     polygons = randomConcaveTiling(initial)
     self.runLocator(polygons)
Beispiel #10
0
 def testRandomTriangles(self):
     poly = randomConvexPolygon(50)
     regions = triangulatePolygon(poly)
     self.runLocator(regions)
Beispiel #11
0
            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--')