inserir em quadtree
This commit is contained in:
parent
cb6130ef66
commit
65bb0ffab0
1 changed files with 55 additions and 31 deletions
86
main.go
86
main.go
|
|
@ -9,6 +9,14 @@ import (
|
||||||
rl "github.com/gen2brain/raylib-go/raylib"
|
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 {
|
type quadnode struct {
|
||||||
// pos, size rl.Vector2
|
// pos, size rl.Vector2
|
||||||
|
|
@ -16,16 +24,49 @@ type quadnode struct {
|
||||||
magnet *magnet
|
magnet *magnet
|
||||||
parent *quadnode
|
parent *quadnode
|
||||||
nodes []*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),
|
pos: rl.NewVector2(0, 0),
|
||||||
size: rl.NewVector2(windowWidth, windowHeight),
|
size: rl.NewVector2(windowWidth, windowHeight),
|
||||||
nodes: nil,
|
nodes: nil,
|
||||||
debug: "root",
|
|
||||||
}
|
}
|
||||||
|
temp.subdivide()
|
||||||
|
return temp
|
||||||
}
|
}
|
||||||
|
|
||||||
func (q *quadnode) subdivide() {
|
func (q *quadnode) subdivide() {
|
||||||
|
|
@ -38,33 +79,27 @@ func (q *quadnode) subdivide() {
|
||||||
pos: q.pos,
|
pos: q.pos,
|
||||||
size: halfSize,
|
size: halfSize,
|
||||||
parent: q,
|
parent: q,
|
||||||
debug: "0",
|
magnet: nil,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
pos: rl.NewVector2(q.pos.X + halfX, q.pos.Y),
|
pos: rl.NewVector2(q.pos.X + halfX, q.pos.Y),
|
||||||
size: halfSize,
|
size: halfSize,
|
||||||
parent: q,
|
parent: q,
|
||||||
debug: "1",
|
magnet: nil,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
pos: rl.NewVector2(q.pos.X, q.pos.Y + halfY),
|
pos: rl.NewVector2(q.pos.X, q.pos.Y + halfY),
|
||||||
size: halfSize,
|
size: halfSize,
|
||||||
parent: q,
|
parent: q,
|
||||||
debug: "2",
|
magnet: nil,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
pos: rl.NewVector2(q.pos.X + halfX, q.pos.Y + halfY),
|
pos: rl.NewVector2(q.pos.X + halfX, q.pos.Y + halfY),
|
||||||
size: halfSize,
|
size: halfSize,
|
||||||
parent: q,
|
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() {
|
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
|
// parâmetros
|
||||||
const initalMagnetCount = 10
|
const initalMagnetCount = 20
|
||||||
const windowWidth = 700
|
const windowWidth = 700
|
||||||
const windowHeight = 700
|
const windowHeight = 700
|
||||||
const magnetRadius = 5
|
const magnetRadius = 5
|
||||||
|
|
@ -194,13 +221,8 @@ func main() {
|
||||||
|
|
||||||
magnets := randomMagnets(initalMagnetCount)
|
magnets := randomMagnets(initalMagnetCount)
|
||||||
|
|
||||||
quadtree := newQuadTree()
|
quadtree := newQuadTreeRoot()
|
||||||
quadtree.subdivide()
|
quadtree.insertMagnet(magnets...)
|
||||||
quadtree.nodes[0].subdivide()
|
|
||||||
quadtree.nodes[1].subdivide()
|
|
||||||
quadtree.nodes[2].subdivide()
|
|
||||||
quadtree.nodes[3].subdivide()
|
|
||||||
quadtree.nodes[2].nodes[0].subdivide()
|
|
||||||
|
|
||||||
pause := true
|
pause := true
|
||||||
|
|
||||||
|
|
@ -213,10 +235,13 @@ func main() {
|
||||||
if pause {
|
if pause {
|
||||||
rl.DrawText("pausado (E)", 0, 40, 20, rl.White)
|
rl.DrawText("pausado (E)", 0, 40, 20, rl.White)
|
||||||
}
|
}
|
||||||
|
quadtree.drawBoundaries()
|
||||||
|
|
||||||
{
|
{
|
||||||
if rl.IsKeyPressed(rl.KeyR) {
|
if rl.IsKeyPressed(rl.KeyR) {
|
||||||
magnets = randomMagnets(initalMagnetCount)
|
magnets = randomMagnets(initalMagnetCount)
|
||||||
|
quadtree := newQuadTreeRoot()
|
||||||
|
quadtree.insertMagnet(magnets...)
|
||||||
}
|
}
|
||||||
if rl.IsKeyPressed(rl.KeyW) {
|
if rl.IsKeyPressed(rl.KeyW) {
|
||||||
magnets = append(magnets, randomMagnets(100)...)
|
magnets = append(magnets, randomMagnets(100)...)
|
||||||
|
|
@ -234,7 +259,6 @@ func main() {
|
||||||
tick(magnets)
|
tick(magnets)
|
||||||
}
|
}
|
||||||
|
|
||||||
quadtree.drawBoundaries()
|
|
||||||
|
|
||||||
for _, magnet := range magnets {
|
for _, magnet := range magnets {
|
||||||
rl.DrawCircleV(magnet.pos, magnet.radius+1, rl.White)
|
rl.DrawCircleV(magnet.pos, magnet.radius+1, rl.White)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue