def test_aabb_collision(self, cls): a = cls(0, 10, 0, 10) b = cls(5, 15, 5, 15) c = cls(11, 15, 11, 16) assert get_collision(a, b) is not None assert get_collision(b, c) is not None assert get_collision(a, c) is None
def get_collision(self, A, B): '''Retorna a colisão entre os objetos A e B depois que a colisão AABB foi detectada''' try: return get_collision(A, B) except CollisionError: pass # Colisão não definida. Primeiro tenta a colisão simétrica e registra # o resultado caso bem sucedido. Caso a colisão simétrica também não # seja implementada, define a colisão como uma aabb try: col = get_collision(B, A) if col is None: return col.normal *= -1 except CollisionError: get_collision[type(A), type(B)] = get_collision_generic get_collision[type(B), type(A)] = get_collision_generic return get_collision_generic(A, B) else: direct = get_collision.get_implementation(type(B), type(A)) def inverse(A, B): '''Automatically created collision for A, B from the supported collision B, A''' col = direct(B, A) if col is not None: return col.swapped() get_collision[type(A), type(B)] = inverse return col
def test_circle_collision(self, cls): c1 = cls(10, (0, 0)) c2 = cls(10, (10, 10)) c3 = cls(10, (20, 20)) assert get_collision(c1, c2) is not None assert get_collision(c2, c3) is not None assert get_collision(c1, c3) is None
def test_poly_collision(): a = Poly(AABB(0, 10, 0, 10).vertices) b = Poly(AABB(5, 15, 5, 15).vertices) c = Poly(AABB(10, 15, 11, 16).vertices) assert get_collision(a, b) is not None assert get_collision(b, c) is not None assert get_collision(a, c) is None
def get_collision(self, A, B): '''Retorna a colisão entre os objetos A e B depois que a colisão AABB foi detectada''' try: return get_collision(A, B) except CollisionError: pass # Colisão não definida. Primeiro tenta a colisão simétrica e registra # o resultado caso bem sucedido. Caso a colisão simétrica também não # seja implementada, define a colisão como uma aabb try: col = get_collision(B, A) if col is None: return col.normal *= -1 except CollisionError: get_collision[type(A), type(B)] = get_collision_aabb get_collision[type(B), type(A)] = get_collision_aabb return get_collision_aabb(A, B) else: def inverse(A, B): '''Automatically created collision for A, B from the supported collision B, A''' col = direct(B, A) if col is not None: return col.swapped() direct = get_collision[type(B), type(A)] get_collision[type(A), type(B)] = inverse return col
def test_poly_aabb_collision(): a = AABB(0, 10, 0, 10) b = AABB(5, 15, 5, 15) c = AABB(10, 15, 11, 16) pa, pb, pc = [Poly(x.vertices) for x in (a, b, c)] assert get_collision(a, pa) is not None assert get_collision(a, pb) is not None assert get_collision(pa, b) is not None assert get_collision(b, pb) is not None assert get_collision(b, pc) is not None assert get_collision(pb, c) is not None assert get_collision(a, pa) is not None assert get_collision(a, pc) is None assert get_collision(pa, c) is None
def update(self, broad_cols): '''Escaneia a lista de colisões grosseiras e detecta quais delas realmente aconteceram''' # Detecta colisões e atualiza as listas internas de colisões de # cada objeto self._data = cols = [] for A, B in broad_cols: if A._invmass > B._invmass: A, B = B, A col = get_collision(A, B) if col is not None: A.add_contact(col) B.add_contact(col) col.world = self.world cols.append(col)