inserir em quadtree

This commit is contained in:
silva guimaraes 2023-08-18 17:34:32 -03:00
parent cb6130ef66
commit 65bb0ffab0

86
main.go
View file

@ -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)