From b9bfb11224d18f54cf7646b954b696927f2fe36c Mon Sep 17 00:00:00 2001 From: any Date: Sun, 10 May 2026 20:29:42 +0200 Subject: [PATCH] =?UTF-8?q?Partikel=20reflexion=20auf=20alle=20vier=20seit?= =?UTF-8?q?en=20verallgemeinert=20und=20in=20eine=20Funktion=20ausgelagert?= =?UTF-8?q?=20die=20durch=20alle=20obstacles=20durch=20geht=20und=20das=20?= =?UTF-8?q?=C3=BCbergebene=20partikel=20davon=20reflektiert?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.go | 53 ++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 40 insertions(+), 13 deletions(-) diff --git a/main.go b/main.go index 11ede03..42b0273 100644 --- a/main.go +++ b/main.go @@ -8,6 +8,7 @@ import ( ) const MAXPOINTS = 100000 +const MAXOBSTACLES = 20 const PI = 3.141592653589793 type quad struct { @@ -56,23 +57,45 @@ func drawRec(rectangle *quad) { rl.DrawLineV((*rectangle).ld, (*rectangle).lu, rl.Black) } -func physics(particleList *[MAXPOINTS]rl.Vector2, particleCount int, particleListKey *sync.Mutex, floor *quad, particleRadius *float32) { +func obstacleReflect(particlePos rl.Vector2, particleSpeed *rl.Vector2, obstacles *([MAXOBSTACLES](*quad)), particleRadius *float32, obstacleCount *int) { + for k := 0; k < *obstacleCount; k++ { + if rl.CheckCollisionCircleLine(particlePos, *particleRadius, (*((*obstacles)[k])).lu, (*((*obstacles)[k])).ru) { + var floorVector rl.Vector2 = rl.Vector2Subtract((*((*obstacles)[k])).ru, (*((*obstacles)[k])).lu) + var normalFloor rl.Vector2 = rl.Vector2Normalize(rl.Vector2Rotate(floorVector, -PI/2)) + //var collisionAngle float32 = 2 * rl.Vector2Angle(rl.Vector2Negate(particleSpeed[i]), normalFloor) + *particleSpeed = rl.Vector2Reflect(*particleSpeed, normalFloor) + } else if rl.CheckCollisionCircleLine(particlePos, *particleRadius, (*((*obstacles)[k])).ru, (*((*obstacles)[k])).rd) { + var floorVector rl.Vector2 = rl.Vector2Subtract((*((*obstacles)[k])).rd, (*((*obstacles)[k])).ru) + var normalFloor rl.Vector2 = rl.Vector2Normalize(rl.Vector2Rotate(floorVector, -PI/2)) + //var collisionAngle float32 = 2 * rl.Vector2Angle(rl.Vector2Negate(particleSpeed[i]), normalFloor) + *particleSpeed = rl.Vector2Reflect(*particleSpeed, normalFloor) + } else if rl.CheckCollisionCircleLine(particlePos, *particleRadius, (*((*obstacles)[k])).rd, (*((*obstacles)[k])).ld) { + var floorVector rl.Vector2 = rl.Vector2Subtract((*((*obstacles)[k])).ld, (*((*obstacles)[k])).rd) + var normalFloor rl.Vector2 = rl.Vector2Normalize(rl.Vector2Rotate(floorVector, -PI/2)) + //var collisionAngle float32 = 2 * rl.Vector2Angle(rl.Vector2Negate(particleSpeed[i]), normalFloor) + *particleSpeed = rl.Vector2Reflect(*particleSpeed, normalFloor) + } else if rl.CheckCollisionCircleLine(particlePos, *particleRadius, (*((*obstacles)[k])).ld, (*((*obstacles)[k])).lu) { + var floorVector rl.Vector2 = rl.Vector2Subtract((*((*obstacles)[k])).lu, (*((*obstacles)[k])).ld) + var normalFloor rl.Vector2 = rl.Vector2Normalize(rl.Vector2Rotate(floorVector, -PI/2)) + //var collisionAngle float32 = 2 * rl.Vector2Angle(rl.Vector2Negate(particleSpeed[i]), normalFloor) + *particleSpeed = rl.Vector2Reflect(*particleSpeed, normalFloor) + } + } +} + +func physics(particleList *[MAXPOINTS]rl.Vector2, particleCount int, particleListKey *sync.Mutex, obstacles *([MAXOBSTACLES](*quad)), particleRadius *float32, obstacleCount *int) { var particleSpeed = [MAXPOINTS]rl.Vector2{{0, -300}} //pixel pro Sekunde var timeIncrement float64 = 0.01 - var gravity rl.Vector2 = rl.Vector2{0, 150} + var gravity rl.Vector2 = rl.Vector2{0, 300} for j := float64(0); j < 50; { var startTime time.Time = time.Now() - particleListKey.Lock() + (*particleListKey).Lock() for i := 0; i < particleCount; i++ { - if rl.CheckCollisionCircleLine(particleList[i], *particleRadius, floor.lu, floor.ru) { - var floorVector rl.Vector2 = rl.Vector2Subtract(floor.ru, floor.lu) - var normalFloor rl.Vector2 = rl.Vector2Normalize(rl.Vector2Rotate(floorVector, -PI/2)) - //var collisionAngle float32 = 2 * rl.Vector2Angle(rl.Vector2Negate(particleSpeed[i]), normalFloor) - particleSpeed[i] = rl.Vector2Reflect(particleSpeed[i], normalFloor) - } + + obstacleReflect((*particleList)[i], &(particleSpeed[i]), obstacles, particleRadius, obstacleCount) particleList[i] = rl.Vector2Add( particleList[i], @@ -84,7 +107,7 @@ func physics(particleList *[MAXPOINTS]rl.Vector2, particleCount int, particleLis rl.Vector2Scale(gravity, float32(timeIncrement))) } - particleListKey.Unlock() + (*particleListKey).Unlock() //fmt.Println(particleList) j += timeIncrement @@ -110,14 +133,15 @@ func main() { rl.EndDrawing() - var particleWidth float32 = 300 + var particleWidth float32 = 600 var particleHeight float32 = 200 var particleColumnCount int = 20 - var particleRowCount int = 20 + var particleRowCount int = 100 var particleCount int = particleRowCount * particleColumnCount var particleRadius float32 = 5 var particleColor rl.Color = rl.Black var particleListKey sync.Mutex + var obstacleCount int = 0 //var stepSize float32 = 10 @@ -126,8 +150,11 @@ func main() { spawnParticlesAsGrid(particleWidth, particleHeight, particleColumnCount, particleRowCount, &particleList) var floor quad = createRectangle(rl.Vector2{600, 700}, 1200, 100, 0*PI/8) + var obstacles = [MAXOBSTACLES]*quad{} + obstacles[0] = &floor + obstacleCount++ - go physics(&particleList, particleCount, &particleListKey, &floor, &particleRadius) + go physics(&particleList, particleCount, &particleListKey, &obstacles, &particleRadius, &obstacleCount) for !rl.WindowShouldClose() { rl.ClearBackground(rl.RayWhite)