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
Ejemplo n.º 2
0
    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
Ejemplo n.º 4
0
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
Ejemplo n.º 5
0
    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
Ejemplo n.º 6
0
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
Ejemplo n.º 7
0
    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)