mirror of
https://github.com/hajimehoshi/ebiten.git
synced 2025-01-13 20:42:07 +01:00
internal/bsp: Fix algorithm
This commit is contained in:
parent
ccfa8f7ef8
commit
ed2bd6defc
@ -50,6 +50,19 @@ func (n *Node) Region() (x, y, width, height int) {
|
|||||||
return n.x, n.y, n.width, n.height
|
return n.x, n.y, n.width, n.height
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// square returns a float value indicating how much the given rectangle is close to a square.
|
||||||
|
// If the given rectangle is square, this return 1 (maximum value).
|
||||||
|
// Otherwise, this returns a value in [0, 1).
|
||||||
|
func square(width, height int) float64 {
|
||||||
|
if width == 0 && height == 0 {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
if width <= height {
|
||||||
|
return float64(width) / float64(height)
|
||||||
|
}
|
||||||
|
return float64(height) / float64(width)
|
||||||
|
}
|
||||||
|
|
||||||
func (n *Node) alloc(width, height int) *Node {
|
func (n *Node) alloc(width, height int) *Node {
|
||||||
if n.width < width || n.height < height {
|
if n.width < width || n.height < height {
|
||||||
return nil
|
return nil
|
||||||
@ -62,7 +75,7 @@ func (n *Node) alloc(width, height int) *Node {
|
|||||||
n.used = true
|
n.used = true
|
||||||
return n
|
return n
|
||||||
}
|
}
|
||||||
if n.height == height || (n.width != width && width <= height) {
|
if square(n.width-width, n.height) >= square(n.width, n.height-height) {
|
||||||
// Split vertically
|
// Split vertically
|
||||||
n.child0 = &Node{
|
n.child0 = &Node{
|
||||||
x: n.x,
|
x: n.x,
|
||||||
|
@ -91,9 +91,9 @@ func TestBSP(t *testing.T) {
|
|||||||
{0, 400, 50, 50},
|
{0, 400, 50, 50},
|
||||||
{100, 0, 200, 200},
|
{100, 0, 200, 200},
|
||||||
nil,
|
nil,
|
||||||
{300, 0, 500, 500},
|
{100, 200, 500, 500},
|
||||||
nil,
|
nil,
|
||||||
{100, 200, 100, 100},
|
{0, 450, 100, 100},
|
||||||
nil,
|
nil,
|
||||||
{0, 200, 100, 200},
|
{0, 200, 100, 200},
|
||||||
},
|
},
|
||||||
@ -129,17 +129,17 @@ func TestBSP(t *testing.T) {
|
|||||||
{0, 768, 256, 256},
|
{0, 768, 256, 256},
|
||||||
|
|
||||||
{256, 0, 256, 256},
|
{256, 0, 256, 256},
|
||||||
|
{512, 0, 256, 256},
|
||||||
|
{768, 0, 256, 256},
|
||||||
{256, 256, 256, 256},
|
{256, 256, 256, 256},
|
||||||
|
|
||||||
{256, 512, 256, 256},
|
{256, 512, 256, 256},
|
||||||
{256, 768, 256, 256},
|
{256, 768, 256, 256},
|
||||||
|
|
||||||
{512, 0, 256, 256},
|
|
||||||
{512, 256, 256, 256},
|
{512, 256, 256, 256},
|
||||||
|
{768, 256, 256, 256},
|
||||||
|
|
||||||
{512, 512, 256, 256},
|
{512, 512, 256, 256},
|
||||||
{512, 768, 256, 256},
|
{512, 768, 256, 256},
|
||||||
|
|
||||||
{768, 0, 256, 256},
|
|
||||||
{768, 256, 256, 256},
|
|
||||||
{768, 512, 256, 256},
|
{768, 512, 256, 256},
|
||||||
{768, 768, 256, 256},
|
{768, 768, 256, 256},
|
||||||
|
|
||||||
@ -164,9 +164,9 @@ func TestBSP(t *testing.T) {
|
|||||||
{0, 300, 300, 300},
|
{0, 300, 300, 300},
|
||||||
{0, 600, 300, 300},
|
{0, 600, 300, 300},
|
||||||
{300, 0, 300, 300},
|
{300, 0, 300, 300},
|
||||||
|
{600, 0, 300, 300},
|
||||||
{300, 300, 300, 300},
|
{300, 300, 300, 300},
|
||||||
{300, 600, 300, 300},
|
{300, 600, 300, 300},
|
||||||
{600, 0, 300, 300},
|
|
||||||
{600, 300, 300, 300},
|
{600, 300, 300, 300},
|
||||||
{600, 600, 300, 300},
|
{600, 600, 300, 300},
|
||||||
nil,
|
nil,
|
||||||
|
Loading…
Reference in New Issue
Block a user