Simulação de colisão de partículas em tempo real, construída com Python e Pygame. O sistema simula partículas simultaneamente, detectando colisões entre si e com as bordas da janela de forma eficiente através de uma uniform grid de particionamento espacial.
demo.mov
Screen.Recording.2024-06-16.at.13.22.353.mov
- Simulação de 7.000 partículas em tempo real
- Colisões entre partículas com reflexão
- Reflexão nas bordas da janela
- Detecção de colisão otimizada com uniform grid (particionamento espacial)
- Prevenção de sobreposição entre partículas
A janela de 700×700 px é dividida em células de 10×10 px, formando uma grade de 70×70 células. Cada partícula é alocada na célula correspondente à sua posição. A detecção de colisão ocorre apenas entre partículas da mesma célula, reduzindo a complexidade de O(n²) para próximo de O(n).
Ao detectar colisão entre duas partículas, o sistema:
- Calcula o vetor normal (linha entre os centros)
- Calcula o vetor tangente (perpendicular ao normal)
- Projeta as velocidades nesses eixos
- Troca as componentes normais (colisão elástica)
- Reposiciona as partículas para evitar sobreposição
Limpar grid → Desenhar partículas → Atualizar posições →
Alocar na grid → Detectar colisões → Refletir nas bordas
particle-collision-system/
├── main.py # Ponto de entrada, loop principal e criação das partículas
├── Particle.py # Classe Particle com física e detecção de colisão
└── particles_manager.py # Classe ParticlesManager com a uniform grid
- Python 3.x — python.org
pip install pygamepython main.pyControles: ESC ou fechar a janela para encerrar.
Os principais parâmetros estão em main.py:
| Parâmetro | Valor padrão | Descrição |
|---|---|---|
WIDTH, HEIGHT |
700, 700 |
Dimensões da janela |
grid_size |
10 |
Tamanho da célula da grade (px) |
| Número de partículas | 7000 |
Quantidade total de partículas |
speed |
3 |
Velocidade de movimento |
radius |
1 |
Raio das partículas |
| FPS | 30 |
Taxa de quadros alvo |