6

我一直在研究这个:

https://github.com/mikechambers/ExamplesByMesh/blob/master/JavaScript/QuadTree/src/QuadTree.js

我相信我了解四叉树的一般概念,尽管我对它们的工作方式和上面的实现有两个问题:

  1. 您是否必须每隔几毫秒重建整个树?在 Javascript 中,这不会非常慢吗?

  2. 如果我有这样的东西:http://davzy.com/screenshots/skitched-20120318-180324.png,那么很容易找到同一个四边形中的其他点,但我有一个矩形可以击中 3 个不同的四边形,是有没有办法让它显示为所有 3 个四边形的孩子?

  3. 在上面示例的 144 中,它说这个 Node.prototype._classConstructor = Node;,我只是好奇发生了什么。我认为原型是一种定义函数或变量以供将来在类中使用的方法,所以我不确定这一行的作用。

4

1 回答 1

6

1. 你不是每隔几毫秒就必须重建整棵树吗?在 Javascript 中,这不会非常慢吗?

我想这取决于您使用它的目的;但是,是的,作者在他的博客文章中关于他的 QuadTree 实现的碰撞检测示例将清除树并每秒大约重新填充 24 次(因此,大约每 40 毫秒一次)。您可以自己判断这是否“非常慢”;在我的机器上看起来很流畅。(即使没有,我希望 QuadTree 的重建实际上比重新绘制画布上的所有圆圈更便宜/更快。)

2. [...] 我有一个矩形,它击中 3 个不同的四边形,有没有办法让它显示为所有 3 个四边形的孩子?

我不确定您所说的“显示”是什么意思,但是:如果您调用构造函数并将pointQuad参数设置为false,那么项目是二维的(即,除了and 之外,它们还有 and width),并且每个项目都是它完全适合内部的最小四边形的孩子。在您的示例中,由于矩形穿过画布的垂直中线,因此它将是根四边形的直接子级。heightxy

3. 在上面示例的 144 中,它说这个 Node.prototype._classConstructor = Node;,我只是好奇发生了什么。[…]

Node类”有一个名为“子类” BoundsNode(当项目是二维时使用),并BoundsNode.prototype._classConstructor设置为BoundsNode(覆盖继承的Node.prototype._classConstructor)。这允许Node'subdivide方法编写new this._classConstructor(...)以便构造一个新的BoundsNodeifthis是 aBoundsNode和一个新的普通Nodeifthis是一个普通的Node

于 2012-03-25T22:39:26.477 回答