mourner/rbush

Returns all items when bounds provided to search contains center 0,0

gitcatrat opened this issue · 3 comments

I'm using a standard scene coordinate system where 0,0 is center and coordinates go from -50,000 to 50,000 in both x and y.
That means that some of the items have negative coordinates, some positives.

But I discovered a curious issue: if bounds for tree.search(bounds) "wrap" 0,0, search returns all the items.

I'll add my extension in case it could affect it but I doubt it:

class RTree extends RBush {
  toBBox(item) {
    return {
      minX: item.x,
      minY: item.y,
      maxX: item.x + item.width,
      maxY: item.y + item.height,
    }:
  }

  compareMinX(a, b) { return a.x - b.x; }
  compareMinY(a, b) { return a.y - b.y; }
}

Item structure:

const item = {
  x: -1000,
  y: -500,
  width: 100,
  height: 50,
  // a lot of irrelevant members
}

Can you publish a fiddle/codepen/plunkr that displays this behaviour?

@IvanSanchez Thanks for the push to replicate it in external environment.
It's not the library's fault, I had few async race conditions which resulted in falsey spatial data on first iteration.

https://codesandbox.io/s/upbeat-lamarr-n3luuw?file=/src/index.js

I can eliminate the issue but this example still raises one question: if inserted item doesn't have valid spatial data, tree.remove will not remove them. Is this expected behaviour? I thought it's deleted by reference by I guess there's some spatial searching going on before we can actually compare the references?

Output will change if you change item spatial data from null to undefined.

if inserted item doesn't have valid spatial data, tree.remove will not remove them. Is this expected behaviour?

rbush assumes that the items have spatial data. If they don't, then that's a case of GIGO. IIRC, rbush needs spatial data to store an item in a rtree leaf and look for it through the branches.