debugando
This commit is contained in:
parent
65bb0ffab0
commit
e69cbb5622
1 changed files with 52 additions and 15 deletions
69
main.go
69
main.go
|
|
@ -18,22 +18,23 @@ type magnet struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
type quadnode struct {
|
type quadtree struct {
|
||||||
// pos, size rl.Vector2
|
// pos, size rl.Vector2
|
||||||
pos, size rl.Vector2
|
pos, size rl.Vector2
|
||||||
magnet *magnet
|
magnet *magnet
|
||||||
parent *quadnode
|
parent *quadtree
|
||||||
nodes []*quadnode
|
nodes []*quadtree
|
||||||
mass float32
|
mass float32
|
||||||
|
debug string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
func (q *quadnode) isOutside(magnet rl.Vector2) bool {
|
func (q *quadtree) isOutside(magnet rl.Vector2) bool {
|
||||||
return magnet.X < q.pos.X || magnet.X >= q.pos.X + q.size.X ||
|
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
|
magnet.Y < q.pos.Y || magnet.Y >= q.pos.Y + q.size.Y
|
||||||
}
|
}
|
||||||
|
|
||||||
func (q *quadnode) isOccupied() (bool, *magnet) {
|
func (q *quadtree) isOccupied() (bool, *magnet) {
|
||||||
if q.magnet == nil {
|
if q.magnet == nil {
|
||||||
return false, nil
|
return false, nil
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -41,7 +42,7 @@ func (q *quadnode) isOccupied() (bool, *magnet) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (q *quadnode) insertMagnet(magnets ...*magnet) {
|
func (q *quadtree) insertMagnet(magnets ...*magnet) {
|
||||||
for _, magnet := range magnets {
|
for _, magnet := range magnets {
|
||||||
|
|
||||||
for _, node := range q.nodes {
|
for _, node := range q.nodes {
|
||||||
|
|
@ -50,59 +51,66 @@ func (q *quadnode) insertMagnet(magnets ...*magnet) {
|
||||||
}
|
}
|
||||||
if occupied, occupyingMagnet := node.isOccupied(); occupied {
|
if occupied, occupyingMagnet := node.isOccupied(); occupied {
|
||||||
node.subdivide()
|
node.subdivide()
|
||||||
node.insertMagnet(occupyingMagnet)
|
node.magnet = nil
|
||||||
}
|
|
||||||
node.insertMagnet(magnet)
|
node.insertMagnet(magnet)
|
||||||
|
node.insertMagnet(occupyingMagnet)
|
||||||
|
break
|
||||||
|
}
|
||||||
node.magnet = magnet
|
node.magnet = magnet
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func newQuadTreeRoot() *quadnode {
|
func newQuadTreeRoot() *quadtree {
|
||||||
temp := &quadnode{
|
temp := &quadtree{
|
||||||
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()
|
temp.subdivide()
|
||||||
return temp
|
return temp
|
||||||
}
|
}
|
||||||
|
|
||||||
func (q *quadnode) subdivide() {
|
func (q *quadtree) subdivide() {
|
||||||
halfX := q.size.X/2
|
halfX := q.size.X/2
|
||||||
halfY := q.size.Y/2
|
halfY := q.size.Y/2
|
||||||
halfSize := rl.NewVector2(halfX, halfY)
|
halfSize := rl.NewVector2(halfX, halfY)
|
||||||
|
|
||||||
q.nodes = []*quadnode{
|
q.nodes = []*quadtree{
|
||||||
{
|
{
|
||||||
pos: q.pos,
|
pos: q.pos,
|
||||||
size: halfSize,
|
size: halfSize,
|
||||||
parent: q,
|
parent: q,
|
||||||
magnet: nil,
|
magnet: nil,
|
||||||
|
debug: "topleft",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
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,
|
||||||
magnet: nil,
|
magnet: nil,
|
||||||
|
debug: "topright",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
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,
|
||||||
magnet: nil,
|
magnet: nil,
|
||||||
|
debug: "bottomleft",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
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,
|
||||||
magnet: nil,
|
magnet: nil,
|
||||||
|
debug: "bottomright",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (q *quadnode) drawBoundaries() {
|
func (q *quadtree) drawBoundaries() {
|
||||||
if q.nodes == nil {
|
if q.nodes == nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
@ -119,7 +127,7 @@ func (q *quadnode) drawBoundaries() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// parâmetros
|
// parâmetros
|
||||||
const initalMagnetCount = 20
|
const initalMagnetCount = 5
|
||||||
const windowWidth = 700
|
const windowWidth = 700
|
||||||
const windowHeight = 700
|
const windowHeight = 700
|
||||||
const magnetRadius = 5
|
const magnetRadius = 5
|
||||||
|
|
@ -184,6 +192,22 @@ func (m *magnet) update(magnets []*magnet) {
|
||||||
m.pos = newPos
|
m.pos = newPos
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (q *quadtree) parents() []*quadtree {
|
||||||
|
if q.parent == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return append(q.parent.parents(), q.parent)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (q *quadtree) printMagnets() {
|
||||||
|
for _, node := range q.nodes {
|
||||||
|
node.printMagnets()
|
||||||
|
if occupied, _ := node.isOccupied(); occupied {
|
||||||
|
fmt.Println(node.magnet.pos, node.parents())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func newMagnet(x, y, mass float32) *magnet {
|
func newMagnet(x, y, mass float32) *magnet {
|
||||||
newMagnet := magnet{
|
newMagnet := magnet{
|
||||||
pos: rl.Vector2{X: x, Y: y},
|
pos: rl.Vector2{X: x, Y: y},
|
||||||
|
|
@ -199,6 +223,7 @@ func newMagnet(x, y, mass float32) *magnet {
|
||||||
return &newMagnet
|
return &newMagnet
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
func randomMagnets(n int) []*magnet {
|
func randomMagnets(n int) []*magnet {
|
||||||
var magnets []*magnet
|
var magnets []*magnet
|
||||||
|
|
||||||
|
|
@ -219,10 +244,20 @@ func main() {
|
||||||
defer rl.CloseWindow()
|
defer rl.CloseWindow()
|
||||||
rl.SetTargetFPS(60)
|
rl.SetTargetFPS(60)
|
||||||
|
|
||||||
magnets := randomMagnets(initalMagnetCount)
|
// magnets := randomMagnets(initalMagnetCount)
|
||||||
|
|
||||||
|
magnets := []*magnet{
|
||||||
|
newMagnet(383, 130, 1),
|
||||||
|
newMagnet(540, 291, 1),
|
||||||
|
newMagnet(122, 490, 1),
|
||||||
|
newMagnet(324, 370, 1),
|
||||||
|
newMagnet(156, 482, 1),
|
||||||
|
}
|
||||||
|
|
||||||
quadtree := newQuadTreeRoot()
|
quadtree := newQuadTreeRoot()
|
||||||
quadtree.insertMagnet(magnets...)
|
quadtree.insertMagnet(magnets...)
|
||||||
|
quadtree.printMagnets()
|
||||||
|
fmt.Println()
|
||||||
|
|
||||||
pause := true
|
pause := true
|
||||||
|
|
||||||
|
|
@ -240,8 +275,10 @@ func main() {
|
||||||
{
|
{
|
||||||
if rl.IsKeyPressed(rl.KeyR) {
|
if rl.IsKeyPressed(rl.KeyR) {
|
||||||
magnets = randomMagnets(initalMagnetCount)
|
magnets = randomMagnets(initalMagnetCount)
|
||||||
quadtree := newQuadTreeRoot()
|
quadtree = newQuadTreeRoot()
|
||||||
quadtree.insertMagnet(magnets...)
|
quadtree.insertMagnet(magnets...)
|
||||||
|
quadtree.printMagnets()
|
||||||
|
fmt.Println()
|
||||||
}
|
}
|
||||||
if rl.IsKeyPressed(rl.KeyW) {
|
if rl.IsKeyPressed(rl.KeyW) {
|
||||||
magnets = append(magnets, randomMagnets(100)...)
|
magnets = append(magnets, randomMagnets(100)...)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue