material-aulas icon indicating copy to clipboard operation
material-aulas copied to clipboard

Escrever sobre 'colisões'

Open villares opened this issue 4 years ago • 3 comments

Colision detection é um material imenso... tem um site inteiro de referência, não tou lembrando agora

villares avatar May 04 '20 19:05 villares

Esse site é demais! Precisamos traduzir uns exemplos: http://www.jeffreythompson.org/collision-detection/

Colisão de dois retângulos:

def rect_on_rect(r1x, r1y, r1w, r1h, r2x, r2y, r2w, r2h):
    # via http://jeffreythompson.org/collision-detection/rect-rect.php
    return (r1x + r1w >= r2x and    # r1 right edge past r2 left
            r1x <= r2x + r2w and          # r1 left edge past r2 right
            r1y + r1h >= r2y and          # r1 top edge past r2 bottom
            r1y <= r2y + r2h) 

Retângulo dentro de área:

def rect_in_area(xm, ym, wm, hm, xa, ya, wa, ha):
    return (xa < xm < xa + wa - wm and
            ya < ym < ya + ha - hm)

villares avatar Jun 11 '20 20:06 villares

Para calcular colisão entre muitas partículas, o truque para não checar duas vezes a colisão é algo assim:

(dica do @introscopia)

int N = particulas.length();
for( int i = 0; i < N; ++i ){
   for( int j = i+1; j < N; ++j ){
       checagem(particulas[i], particulas[j]);
   }
}

Em Python talvez algo assim (preciso testar):

for i, particula in enumerate(particulas):
    for outra in particulas[i + 1:]:
        checagem(particula, outra)

villares avatar Jul 14 '20 17:07 villares

Se você estiver 'dentro da partícula':

def checa_com_outras(self):
    for outra in particulas:
        if outra is self: break
        else: self.checagen(outra) # ou checagem(self, outra)

image

villares avatar Jul 14 '20 20:07 villares