Boids Fase 1: Corregir bug de clustering crítico
PROBLEMA RESUELTO:
Los boids colapsaban al mismo punto dentro de cada grupo, haciendo
el sistema visualmente inutilizable.
CAMBIOS IMPLEMENTADOS:
1. BOIDS_ROADMAP.md creado (NEW FILE)
- Roadmap completo de 6 fases para mejora de boids
- Diagnóstico detallado de problemas actuales
- Plan de implementación con métricas de éxito
- Fase 1 (crítica): Fix clustering
- Fase 2 (alto impacto): Spatial Hash Grid O(n²)→O(n)
- Fases 3-6: Mejoras visuales, comportamientos avanzados
2. defines.h - Rebalanceo de parámetros (Fase 1.1)
- BOID_SEPARATION_RADIUS: 30→25px
- BOID_COHESION_RADIUS: 80→60px (REDUCIDO 25%)
- BOID_SEPARATION_WEIGHT: 1.5→3.0 (TRIPLICADO)
- BOID_COHESION_WEIGHT: 0.8→0.5 (REDUCIDO 37%)
- BOID_MAX_FORCE: 0.1→0.5 (QUINTUPLICADO)
- BOID_MIN_SPEED: 0.5 (NUEVO - evita boids estáticos)
3. boid_manager.cpp - Mejoras físicas
- Fase 1.2: Velocidad mínima en limitSpeed()
* Evita boids completamente estáticos
* Mantiene movimiento continuo
- Fase 1.3: Fuerza de separación proporcional a cercanía
* Antes: dividir por distance² (muy débil)
* Ahora: proporcional a (RADIUS - distance) / RADIUS
* Resultado: 100% fuerza en colisión, 0% en radio máximo
RESULTADO ESPERADO:
✅ Separación domina sobre cohesión (peso 3.0 vs 0.5)
✅ Boids mantienen distancia personal (~10-15px)
✅ Sin colapso a puntos únicos
✅ Movimiento continuo sin boids estáticos
PRÓXIMOS PASOS:
- Testing manual con 100, 1000 boids
- Validar comportamiento disperso sin clustering
- Fase 2: Spatial Hash Grid para rendimiento O(n)
Estado: Compilación exitosa, listo para testing
Rama: boids_development
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -141,9 +141,11 @@ void BoidManager::applySeparation(Ball* boid, float delta_time) {
|
||||
float distance = std::sqrt(dx * dx + dy * dy);
|
||||
|
||||
if (distance > 0.0f && distance < BOID_SEPARATION_RADIUS) {
|
||||
// Vector normalizado apuntando lejos del vecino, ponderado por cercanía
|
||||
steer_x += (dx / distance) / distance;
|
||||
steer_y += (dy / distance) / distance;
|
||||
// FASE 1.3: Separación más fuerte cuando más cerca (inversamente proporcional a distancia)
|
||||
// Fuerza proporcional a cercanía: 0% en radio máximo, 100% en colisión
|
||||
float separation_strength = (BOID_SEPARATION_RADIUS - distance) / BOID_SEPARATION_RADIUS;
|
||||
steer_x += (dx / distance) * separation_strength;
|
||||
steer_y += (dy / distance) * separation_strength;
|
||||
count++;
|
||||
}
|
||||
}
|
||||
@@ -306,9 +308,18 @@ void BoidManager::limitSpeed(Ball* boid) {
|
||||
boid->getVelocity(vx, vy);
|
||||
|
||||
float speed = std::sqrt(vx * vx + vy * vy);
|
||||
|
||||
// Limitar velocidad máxima
|
||||
if (speed > BOID_MAX_SPEED) {
|
||||
vx = (vx / speed) * BOID_MAX_SPEED;
|
||||
vy = (vy / speed) * BOID_MAX_SPEED;
|
||||
boid->setVelocity(vx, vy);
|
||||
}
|
||||
|
||||
// FASE 1.2: Aplicar velocidad mínima (evitar boids estáticos)
|
||||
if (speed > 0.0f && speed < BOID_MIN_SPEED) {
|
||||
vx = (vx / speed) * BOID_MIN_SPEED;
|
||||
vy = (vy / speed) * BOID_MIN_SPEED;
|
||||
boid->setVelocity(vx, vy);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user