diff --git a/main.go b/main.go index 2604104..7bbb776 100644 --- a/main.go +++ b/main.go @@ -9,6 +9,14 @@ import ( rl "github.com/gen2brain/raylib-go/raylib" ) +type magnet struct { + pos rl.Vector2 + speed rl.Vector2 + color rl.Color + mass float32 + radius float32 +} + type quadnode struct { // pos, size rl.Vector2 @@ -16,16 +24,49 @@ type quadnode struct { magnet *magnet parent *quadnode nodes []*quadnode - debug string + mass float32 } -func newQuadTree() *quadnode { - return &quadnode{ + +func (q *quadnode) isOutside(magnet rl.Vector2) bool { + return magnet.X < q.pos.X || magnet.X >= q.pos.X + q.size.X || + magnet.Y < q.pos.Y || magnet.Y >= q.pos.Y + q.size.Y +} + +func (q *quadnode) isOccupied() (bool, *magnet) { + if q.magnet == nil { + return false, nil + } else { + return true, q.magnet + } +} + +func (q *quadnode) insertMagnet(magnets ...*magnet) { + for _, magnet := range magnets { + + for _, node := range q.nodes { + if node.isOutside(magnet.pos) { + continue + } + if occupied, occupyingMagnet := node.isOccupied(); occupied { + node.subdivide() + node.insertMagnet(occupyingMagnet) + } + node.insertMagnet(magnet) + node.magnet = magnet + break + } + } +} + +func newQuadTreeRoot() *quadnode { + temp := &quadnode{ pos: rl.NewVector2(0, 0), size: rl.NewVector2(windowWidth, windowHeight), nodes: nil, - debug: "root", } + temp.subdivide() + return temp } func (q *quadnode) subdivide() { @@ -38,33 +79,27 @@ func (q *quadnode) subdivide() { pos: q.pos, size: halfSize, parent: q, - debug: "0", + magnet: nil, }, { pos: rl.NewVector2(q.pos.X + halfX, q.pos.Y), size: halfSize, parent: q, - debug: "1", + magnet: nil, }, { pos: rl.NewVector2(q.pos.X, q.pos.Y + halfY), size: halfSize, parent: q, - debug: "2", + magnet: nil, }, { pos: rl.NewVector2(q.pos.X + halfX, q.pos.Y + halfY), size: halfSize, parent: q, - debug: "3", + magnet: nil, }, } - fmt.Println(q.debug) - fmt.Println("halfX", halfX, "halfY", halfY) - for i, node := range q.nodes { - fmt.Println(i, node.pos, node.size) - } - // fmt.Println(q.nodes) } func (q *quadnode) drawBoundaries() { @@ -83,16 +118,8 @@ func (q *quadnode) drawBoundaries() { } } -type magnet struct { - pos rl.Vector2 - speed rl.Vector2 - color rl.Color - mass float32 - radius float32 -} - // parà‚metros -const initalMagnetCount = 10 +const initalMagnetCount = 20 const windowWidth = 700 const windowHeight = 700 const magnetRadius = 5 @@ -194,13 +221,8 @@ func main() { magnets := randomMagnets(initalMagnetCount) - quadtree := newQuadTree() - quadtree.subdivide() - quadtree.nodes[0].subdivide() - quadtree.nodes[1].subdivide() - quadtree.nodes[2].subdivide() - quadtree.nodes[3].subdivide() - quadtree.nodes[2].nodes[0].subdivide() + quadtree := newQuadTreeRoot() + quadtree.insertMagnet(magnets...) pause := true @@ -213,10 +235,13 @@ func main() { if pause { rl.DrawText("pausado (E)", 0, 40, 20, rl.White) } + quadtree.drawBoundaries() { if rl.IsKeyPressed(rl.KeyR) { magnets = randomMagnets(initalMagnetCount) + quadtree := newQuadTreeRoot() + quadtree.insertMagnet(magnets...) } if rl.IsKeyPressed(rl.KeyW) { magnets = append(magnets, randomMagnets(100)...) @@ -234,7 +259,6 @@ func main() { tick(magnets) } - quadtree.drawBoundaries() for _, magnet := range magnets { rl.DrawCircleV(magnet.pos, magnet.radius+1, rl.White)