villares / material-aulas

Material para ensino introdutório de programação com Python em um contexto visual
https://abav.lugaralgum.com/material-aulas/
97 stars 70 forks source link

Escrever sobre 'colisões' #49

Closed villares closed 8 months ago

villares commented 4 years ago

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

villares commented 4 years ago

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 commented 4 years ago

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 commented 4 years ago

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 commented 8 months ago

Vou escrever aqui: https://github.com/villares/material-aulas/blob/main/Processing-Python-py5/colisoes.md