def setUp(self): self.o1 = BlobOctree(((-1.0, 1.0), (-1.0, 1.0), (-1.0, 1.0))) self.o2 = BlobOctree(((-1.0, 1.0), (-1.0, 1.0), (-1.0, 1.0))) self.coords = [(sin(0.1 * t), sin(0.2 * t), sin(0.3 * t)) for t in xrange(100)] m = 0.1 self.extents = [((x - m, x + m), (y - m, y + m), (z - m, z + m)) for (x, y, z) in self.coords] arguments = zip(self.coords, self.extents, xrange(100)) self.o1.extend(arguments[:50]) self.o2.extend(arguments[50:])
class BlobTests(TestCase): def setUp(self): self.o1 = BlobOctree(((-1.0, 1.0), (-1.0, 1.0), (-1.0, 1.0))) self.o2 = BlobOctree(((-1.0, 1.0), (-1.0, 1.0), (-1.0, 1.0))) self.coords = [(sin(0.1 * t), sin(0.2 * t), sin(0.3 * t)) for t in xrange(100)] m = 0.1 self.extents = [((x - m, x + m), (y - m, y + m), (z - m, z + m)) for (x, y, z) in self.coords] arguments = zip(self.coords, self.extents, xrange(100)) self.o1.extend(arguments[:50]) self.o2.extend(arguments[50:]) def test_basic(self): self.assertEqual(len(self.o1), 50) self.assertEqual( set(self.o1), set(zip(self.coords[:50], self.extents[:50], xrange(50)))) self.assertEqual(len(self.o2), 50) self.assertEqual( set(self.o2), set(zip(self.coords[50:], self.extents[50:], xrange(50, 100)))) def test_intersect_with_box(self): b1 = ((-0.5, 0.5), (-0.2, 0.8), (-0.7, 0.3)) s1 = set(self.o1.intersect_with_box(b1)) s2 = set(self.o1.intersection_with_box(b1)) s3 = set( (p, b, d) for (p, b, d) in self.o1 if not boxes_disjoint(b, b1)) self.assertEqual(s1, s3) self.assertEqual(s2, s3) def test_possible_overlaps(self): s1 = set((x[2], y[2]) for (x, y) in self.o1.possible_overlaps(self.o2)) d2 = dict(self.o1.by_possible_overlap(self.o2)) s2 = set((x[2], y[2]) for (x, l) in d2.iteritems() for y in l) s3 = set((x[2], y[2]) for x in self.o1 for y in self.o2.intersect_with_box(x[1])) s0 = set((x[2], y[2]) for x in self.o1 for y in self.o2 if not boxes_disjoint(x[1], y[1])) self.assertEqual(s1, s0) self.assertEqual(s2, s0) self.assertEqual(s3, s0) def test_intersect_with_line(self): for xi in xrange(-8, 8, 2): x = xi / 10 for yi in xrange(-8, 8, 2): y = yi / 10 for zi in xrange(-8, 8, 2): z = zi / 10 def decent(t): ((minx, maxx), (miny, maxy), (minz, maxz)) = t return maxx > x and miny < y < maxy and minz < z < maxz s0 = set(self.o1.intersect_with_line((x, y, z), (1, 0, 0))) s1 = set(t for t in self.o1 if decent(t[1])) self.assertEqual(s0, s1) def test_intersect_with_line_segment(self): s0 = set( self.o1.intersect_with_line_segment((-0.5, -0.5, -0.5), (0.5, 0.5, 0.5))) s1 = set() for t in zip(self.coords, self.extents, xrange(50)): (p, b, n) = t for i in xrange(-500, 501): x = (i / 1000.0, i / 1000.0, i / 1000.0) if point_in_box(x, b): s1.add(t) break self.assertEqual(s0, s1) def test_intersect_with_plane(self): for d in [0]: fn = lambda p: p[d] - 0.25 s0 = set(self.o1.intersect_with_plane(fn)) s1 = set() for t in zip(self.coords, self.extents, xrange(50)): (_, b, _) = t if b[d][0] <= 0.25 <= b[d][1]: s1.add(t) self.assertEqual(s0, s1)
class BlobTests(TestCase): def setUp(self): self.o1 = BlobOctree(((-1.0, 1.0), (-1.0, 1.0), (-1.0, 1.0))) self.o2 = BlobOctree(((-1.0, 1.0), (-1.0, 1.0), (-1.0, 1.0))) self.coords = [(sin(0.1 * t), sin(0.2 * t), sin(0.3 * t)) for t in xrange(100)] m = 0.1 self.extents = [((x - m, x + m), (y - m, y + m), (z - m, z + m)) for (x, y, z) in self.coords] arguments = zip(self.coords, self.extents, xrange(100)) self.o1.extend(arguments[:50]) self.o2.extend(arguments[50:]) def test_basic(self): self.assertEqual(len(self.o1), 50) self.assertEqual(set(self.o1), set(zip(self.coords[:50], self.extents[:50], xrange(50)))) self.assertEqual(len(self.o2), 50) self.assertEqual(set(self.o2), set(zip(self.coords[50:], self.extents[50:], xrange(50, 100)))) def test_intersect_with_box(self): b1 = ((-0.5, 0.5), (-0.2, 0.8), (-0.7, 0.3)) s1 = set(self.o1.intersect_with_box(b1)) s2 = set(self.o1.intersection_with_box(b1)) s3 = set((p, b, d) for (p, b, d) in self.o1 if not boxes_disjoint(b, b1)) self.assertEqual(s1, s3) self.assertEqual(s2, s3) def test_possible_overlaps(self): s1 = set((x[2], y[2]) for (x, y) in self.o1.possible_overlaps(self.o2)) d2 = dict(self.o1.by_possible_overlap(self.o2)) s2 = set((x[2], y[2]) for (x, l) in d2.iteritems() for y in l) s3 = set((x[2], y[2]) for x in self.o1 for y in self.o2.intersect_with_box(x[1])) s0 = set((x[2], y[2]) for x in self.o1 for y in self.o2 if not boxes_disjoint(x[1], y[1])) self.assertEqual(s1, s0) self.assertEqual(s2, s0) self.assertEqual(s3, s0) def test_intersect_with_line(self): for xi in xrange(-8, 8, 2): x = xi / 10 for yi in xrange(-8, 8, 2): y = yi / 10 for zi in xrange(-8, 8, 2): z = zi / 10 def decent(t): ((minx, maxx), (miny, maxy), (minz, maxz)) = t return maxx > x and miny < y < maxy and minz < z < maxz s0 = set(self.o1.intersect_with_line((x, y, z), (1, 0, 0))) s1 = set(t for t in self.o1 if decent(t[1])) self.assertEqual(s0, s1) def test_intersect_with_line_segment(self): s0 = set(self.o1.intersect_with_line_segment((-0.5, -0.5, -0.5), (0.5, 0.5, 0.5))) s1 = set() for t in zip(self.coords, self.extents, xrange(50)): (p, b, n) = t for i in xrange(-500, 501): x = (i / 1000.0, i / 1000.0, i / 1000.0) if point_in_box(x, b): s1.add(t) break self.assertEqual(s0, s1) def test_intersect_with_plane(self): for d in [0]: fn = lambda p: p[d] - 0.25 s0 = set(self.o1.intersect_with_plane(fn)) s1 = set() for t in zip(self.coords, self.extents, xrange(50)): (_, b, _) = t if b[d][0] <= 0.25 <= b[d][1]: s1.add(t) self.assertEqual(s0, s1)