def testKochSnowflakePath(self): # L'algoritmo di Malkman a volte restituisce un numero di punti diverso # dall'agoritmo Monotone chain e comunque in diverso ordine. for level in range(5): snowflake = snowflake_path(level) self.assertEqual(len(snowflake), 3*4**level+1) CHpath = convex_hull(snowflake) CHpoints = convex_hull(snowflake.points()) for p in CHpath: self.assertTrue(inside_equal(p, CHpoints, True)) for p in CHpoints: self.assertTrue(inside_equal(p, CHpath, True))
def testRandomSetOfPoint(self): random.seed(123) rand = random.random npoints = 100 scale_f = 20.0 pts = [] for n in range(npoints): pt = P(scale_f*(rand()-0.5), scale_f*(rand()-0.5)) pts.append(pt) CH = convex_hull(pts) for p in pts: is_inside_with_overlap = inside_equal(p, CH, True) is_inside_strict = inside_equal(p, CH, False) self.assertTrue(is_inside_with_overlap) if is_inside_with_overlap and not is_inside_strict: self.assertTrue(p in CH)
def testInsideEqual(self): self.p1 = geo2d.Path([P(0,0), P(10,0), P(10,10), P(0,10), P(0,0)]) # Rombo chiuso in 0,0 di diagonali 10 e 5 self.p3 = geo2d.Path([P(0,0), P(2.5,5), P(0,10), P(-2.5,5), P(0,0)]) # punto interno al rombo self.assertEqual( geo2d.inside_equal(P(1, 2.5), self.p3, True), True) self.assertEqual( geo2d.inside_equal(P(1, 2.5), self.p3, False), True) # punto esterno al rombo self.assertEqual( geo2d.inside_equal(P(2, 2.5), self.p3, True), False) self.assertEqual( geo2d.inside_equal(P(2, 2.5), self.p3, False), False) # punto su lato obliquo del rombo self.assertEqual( geo2d.inside_equal(P(1.25, 2.5), self.p3, False), False) self.assertEqual( geo2d.inside_equal(P(1.25, 2.5), self.p3, True), True) # punto interno al quadrato self.assertEqual( geo2d.inside_equal(P(5,5), self.p1, True), True) self.assertEqual( geo2d.inside_equal(P(5,5), self.p1, False), True) # punto esterno al quadrato self.assertEqual( geo2d.inside_equal(P(11,11), self.p1, True), False) self.assertEqual( geo2d.inside_equal(P(11,11), self.p1, False), False) # punto su segmento verticale self.assertEqual( geo2d.inside_equal(P(10,5), self.p1, True), True) self.assertEqual( geo2d.inside_equal(P(10,5), self.p1, False), False) # punto su segmento orizzontale self.assertEqual( geo2d.inside_equal(P(5,0), self.p1, True), True) self.assertEqual( geo2d.inside_equal(P(5,0), self.p1, False), False) # punto su vertice self.assertEqual( geo2d.inside_equal(P(0,0), self.p1, False), False) self.assertEqual( geo2d.inside_equal(P(0,0), self.p1, True), True) # altro punto su vertice self.assertEqual( geo2d.inside_equal(P(10,10), self.p1, False), False) self.assertEqual( geo2d.inside_equal(P(10,10), self.p1, True), True)