diff --git a/main.go b/main.go index 587b440..1b51579 100644 --- a/main.go +++ b/main.go @@ -87,6 +87,7 @@ func physics(particleList *[MAXPOINTS]rl.Vector2, particleCount int, particleLis var gravity rl.Vector2 = rl.Vector2{0, 300} var newParticleList [MAXPOINTS]rl.Vector2 var newParticleSpeed [MAXPOINTS]rl.Vector2 + var particleFriction float32 = 0.85 for j := float64(0); j < 50; { var startTime time.Time = time.Now() @@ -105,10 +106,22 @@ func physics(particleList *[MAXPOINTS]rl.Vector2, particleCount int, particleLis // Jede Goroutine arbeitet nur auf Index i → kein Datenkonflikt for l := 0; l < particleCount; l++ { - if rl.CheckCollisionCircles(currentPositions[i], *particleRadius, currentPositions[l], *particleRadius) && (l != i) { - var colNormal rl.Vector2 = rl.Vector2Normalize(rl.Vector2Subtract(currentPositions[i], currentPositions[l])) - particleSpeed[i] = rl.Vector2Reflect(particleSpeed[i], colNormal) - currentPositions[i] = rl.Vector2Add(currentPositions[i], rl.Vector2Scale(rl.Vector2Normalize(particleSpeed[i]), *particleRadius/2)) + if l == i { + continue + } + + diff := rl.Vector2Subtract(currentPositions[i], currentPositions[l]) + dist := rl.Vector2Length(diff) + minDist := *particleRadius * 2 + + if dist < minDist && dist > 0 { + colNormal := rl.Vector2Scale(diff, 1/dist) //durch länge des Vektoren teilen + + // Exakt die Hälfte der Überlappung korrigieren + overlap := minDist - dist + currentPositions[i] = rl.Vector2Add(currentPositions[i], rl.Vector2Scale(colNormal, overlap*0.5)) + + particleSpeed[i] = rl.Vector2Scale(rl.Vector2Reflect(particleSpeed[i], colNormal), particleFriction) } }