commit inicial
This commit is contained in:
commit
f88f7f9d12
3 changed files with 147 additions and 0 deletions
5
go.mod
Normal file
5
go.mod
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
module barnes-hut
|
||||||
|
|
||||||
|
go 1.20
|
||||||
|
|
||||||
|
require github.com/gen2brain/raylib-go/raylib v0.0.0-20230719211022-1083eace2049
|
||||||
2
go.sum
Normal file
2
go.sum
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
github.com/gen2brain/raylib-go/raylib v0.0.0-20230719211022-1083eace2049 h1:fJeDPYJDyT+KeWKsIMbRlNcSgsQ2nZ4bJLwBraVA/xU=
|
||||||
|
github.com/gen2brain/raylib-go/raylib v0.0.0-20230719211022-1083eace2049/go.mod h1:AwtGA3aTtYdezNxEVbfchaLw/z+CuRDh2Mlxy0FbBro=
|
||||||
140
main.go
Normal file
140
main.go
Normal file
|
|
@ -0,0 +1,140 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
// veja:
|
||||||
|
// The relationship between chaos, fractal and physics
|
||||||
|
// https://www.youtube.com/watch?v=C5Jkgvw-Z6E
|
||||||
|
|
||||||
|
import (
|
||||||
|
// "fmt"
|
||||||
|
"fmt"
|
||||||
|
"math"
|
||||||
|
"math/rand"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
|
// "math/rand"
|
||||||
|
|
||||||
|
rl "github.com/gen2brain/raylib-go/raylib"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
type magnet struct {
|
||||||
|
pos rl.Vector2
|
||||||
|
speed rl.Vector2
|
||||||
|
color rl.Color
|
||||||
|
// force float32
|
||||||
|
// radius float32
|
||||||
|
}
|
||||||
|
|
||||||
|
// type ball struct {
|
||||||
|
// pos rl.Vector2
|
||||||
|
// originGrid rl.Vector2
|
||||||
|
// radius float32
|
||||||
|
// speed rl.Vector2
|
||||||
|
// steps int
|
||||||
|
// }
|
||||||
|
|
||||||
|
// parâmetros
|
||||||
|
const initalMagnetCount = 100
|
||||||
|
const windowWidth = 700
|
||||||
|
const windowHeight = 700
|
||||||
|
const magnetRadius = 5
|
||||||
|
const gravConst float32 = 10
|
||||||
|
|
||||||
|
// func insideArea(pos rl.Vector2) (bool, bool) {
|
||||||
|
// return pos.X > 0 && pos.X < windowWidth, pos.Y > 0 && pos.Y < windowHeight
|
||||||
|
// }
|
||||||
|
|
||||||
|
func (m *magnet) update(magnets []*magnet) {
|
||||||
|
magnetsPull := rl.Vector2{}
|
||||||
|
|
||||||
|
for _, magnet := range magnets {
|
||||||
|
if m == magnet { continue }
|
||||||
|
|
||||||
|
direction := rl.Vector2Normalize(rl.Vector2Subtract(m.pos, magnet.pos))
|
||||||
|
distance := rl.Vector2Distance(magnet.pos, m.pos)
|
||||||
|
if (distance < magnetRadius*2) {
|
||||||
|
// direction = rl.Vector2Negate(direction)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
distanceSquared := math.Pow(float64(distance), 2)
|
||||||
|
force := gravConst / float32(distanceSquared)
|
||||||
|
|
||||||
|
acceleration := rl.Vector2Scale(direction, -force)
|
||||||
|
|
||||||
|
magnetsPull = rl.Vector2Add(magnetsPull, acceleration)
|
||||||
|
}
|
||||||
|
|
||||||
|
m.speed = rl.Vector2Add(m.speed, magnetsPull)
|
||||||
|
newPos := rl.Vector2Add(m.speed, m.pos)
|
||||||
|
|
||||||
|
// x, y := insideArea(newPos)
|
||||||
|
// if !x { newPos.X = -newPos.X; m.speed.X = 0 }
|
||||||
|
// if !y { newPos.Y = -newPos.Y; m.speed.Y = 0 }
|
||||||
|
|
||||||
|
m.pos = newPos
|
||||||
|
}
|
||||||
|
|
||||||
|
func randomMagnet() *magnet {
|
||||||
|
newMagnet := magnet{
|
||||||
|
pos: rl.Vector2{
|
||||||
|
X: float32(rand.Intn(windowWidth - 100) + 50),
|
||||||
|
Y: float32(rand.Intn(windowHeight - 100) + 50),
|
||||||
|
},
|
||||||
|
color: rl.NewColor(
|
||||||
|
uint8(rand.Int()),
|
||||||
|
uint8(rand.Int()),
|
||||||
|
uint8(rand.Int()),
|
||||||
|
255,
|
||||||
|
),
|
||||||
|
}
|
||||||
|
return &newMagnet
|
||||||
|
}
|
||||||
|
|
||||||
|
func createMagnets(n int) []*magnet {
|
||||||
|
var magnets []*magnet
|
||||||
|
|
||||||
|
for i := 0; i < n; i++ {
|
||||||
|
magnets = append(magnets, randomMagnet())
|
||||||
|
}
|
||||||
|
return magnets
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
rl.InitWindow(
|
||||||
|
windowWidth, windowHeight,
|
||||||
|
"barnes hut",
|
||||||
|
)
|
||||||
|
defer rl.CloseWindow()
|
||||||
|
rl.SetTargetFPS(60)
|
||||||
|
|
||||||
|
magnets := createMagnets(initalMagnetCount)
|
||||||
|
|
||||||
|
for !rl.WindowShouldClose() {
|
||||||
|
rl.BeginDrawing()
|
||||||
|
rl.ClearBackground(rl.Black)
|
||||||
|
rl.DrawFPS(0, 0)
|
||||||
|
|
||||||
|
// func rl.DrawText(text string, posX int32, posY int32, fontSize int32, col color.RGBA)
|
||||||
|
rl.DrawText(strconv.Itoa(len(magnets)), 0, 20, 20, rl.White)
|
||||||
|
|
||||||
|
{
|
||||||
|
if rl.IsKeyPressed(rl.KeyR) {
|
||||||
|
magnets = createMagnets(len(magnets))
|
||||||
|
}
|
||||||
|
if rl.IsKeyPressed(rl.KeyW) {
|
||||||
|
magnets = append(magnets, createMagnets(100)...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, magnet := range magnets {
|
||||||
|
magnet.update(magnets)
|
||||||
|
rl.DrawCircleV(magnet.pos, magnetRadius+1, rl.White)
|
||||||
|
rl.DrawCircleV(magnet.pos, magnetRadius, magnet.color)
|
||||||
|
}
|
||||||
|
|
||||||
|
rl.EndDrawing()
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println("hello world")
|
||||||
|
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue