Partikel reflexion auf alle vier seiten verallgemeinert und in eine Funktion ausgelagert die durch alle obstacles durch geht und das übergebene partikel davon reflektiert
This commit is contained in:
@@ -8,6 +8,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const MAXPOINTS = 100000
|
const MAXPOINTS = 100000
|
||||||
|
const MAXOBSTACLES = 20
|
||||||
const PI = 3.141592653589793
|
const PI = 3.141592653589793
|
||||||
|
|
||||||
type quad struct {
|
type quad struct {
|
||||||
@@ -56,23 +57,45 @@ func drawRec(rectangle *quad) {
|
|||||||
rl.DrawLineV((*rectangle).ld, (*rectangle).lu, rl.Black)
|
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 particleSpeed = [MAXPOINTS]rl.Vector2{{0, -300}} //pixel pro Sekunde
|
||||||
var timeIncrement float64 = 0.01
|
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; {
|
for j := float64(0); j < 50; {
|
||||||
var startTime time.Time = time.Now()
|
var startTime time.Time = time.Now()
|
||||||
|
|
||||||
particleListKey.Lock()
|
(*particleListKey).Lock()
|
||||||
|
|
||||||
for i := 0; i < particleCount; i++ {
|
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)
|
obstacleReflect((*particleList)[i], &(particleSpeed[i]), obstacles, particleRadius, obstacleCount)
|
||||||
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)
|
|
||||||
}
|
|
||||||
particleList[i] =
|
particleList[i] =
|
||||||
rl.Vector2Add(
|
rl.Vector2Add(
|
||||||
particleList[i],
|
particleList[i],
|
||||||
@@ -84,7 +107,7 @@ func physics(particleList *[MAXPOINTS]rl.Vector2, particleCount int, particleLis
|
|||||||
rl.Vector2Scale(gravity, float32(timeIncrement)))
|
rl.Vector2Scale(gravity, float32(timeIncrement)))
|
||||||
}
|
}
|
||||||
|
|
||||||
particleListKey.Unlock()
|
(*particleListKey).Unlock()
|
||||||
//fmt.Println(particleList)
|
//fmt.Println(particleList)
|
||||||
|
|
||||||
j += timeIncrement
|
j += timeIncrement
|
||||||
@@ -110,14 +133,15 @@ func main() {
|
|||||||
|
|
||||||
rl.EndDrawing()
|
rl.EndDrawing()
|
||||||
|
|
||||||
var particleWidth float32 = 300
|
var particleWidth float32 = 600
|
||||||
var particleHeight float32 = 200
|
var particleHeight float32 = 200
|
||||||
var particleColumnCount int = 20
|
var particleColumnCount int = 20
|
||||||
var particleRowCount int = 20
|
var particleRowCount int = 100
|
||||||
var particleCount int = particleRowCount * particleColumnCount
|
var particleCount int = particleRowCount * particleColumnCount
|
||||||
var particleRadius float32 = 5
|
var particleRadius float32 = 5
|
||||||
var particleColor rl.Color = rl.Black
|
var particleColor rl.Color = rl.Black
|
||||||
var particleListKey sync.Mutex
|
var particleListKey sync.Mutex
|
||||||
|
var obstacleCount int = 0
|
||||||
|
|
||||||
//var stepSize float32 = 10
|
//var stepSize float32 = 10
|
||||||
|
|
||||||
@@ -126,8 +150,11 @@ func main() {
|
|||||||
spawnParticlesAsGrid(particleWidth, particleHeight, particleColumnCount, particleRowCount, &particleList)
|
spawnParticlesAsGrid(particleWidth, particleHeight, particleColumnCount, particleRowCount, &particleList)
|
||||||
|
|
||||||
var floor quad = createRectangle(rl.Vector2{600, 700}, 1200, 100, 0*PI/8)
|
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() {
|
for !rl.WindowShouldClose() {
|
||||||
rl.ClearBackground(rl.RayWhite)
|
rl.ClearBackground(rl.RayWhite)
|
||||||
|
|||||||
Reference in New Issue
Block a user