2012-03-18 74 views
6

我一直在研究這個:關於2D碰撞四棵

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. 在上面的例子中,它說這個Node.prototype._classConstructor = Node,我只是好奇發生了什麼事情。我認爲原型是定義一個函數或變量以供將來在課堂中使用的一種方式,所以我不確定這條線是幹什麼的。

回答

5

1.你不會要重建整個樹每隔幾毫秒?在JavaScript中這不會很慢嗎?

我想這取決於你使用的是什麼;但是,作者在his blog post about his QuadTree implementation中的碰撞檢測示例將清除該樹並每秒重新生成大約24次(因此,大約每40毫秒一次)。你可以自己判斷這是否「非常緩慢」;在我的機器上看起來相當平滑。 (即使不這樣做,我也希望QuadTree的重建實際上比重畫畫布上的所有圓圈更便宜/更快)。

2. […]我有一個長方形擊中3個不同的四邊形,是否有一種方法可以讓它顯示爲所有三個四邊形中的一個小孩?

我不知道你所說的「顯示」的意思,但如果你調用構造函數與pointQuad參數設置爲false,那麼項目是二維的(也就是說,他們除了擁有widthheightxy),並且每個項目將是完全適合其內部的最小四邊形的子項。在你的例子中,由於矩形穿過畫布的垂直中線,它將是根四邊形的直接子元素。

3.在上面的例子中,它說這個Node.prototype._classConstructor = Node,我只是好奇發生了什麼。 […]

Node「類」具有「子類」命名BoundsNode(當物品是二維使用)和BoundsNode.prototype._classConstructor設置爲BoundsNode(其覆蓋繼承Node.prototype._classConstructor)。這允許Nodesubdivide方法,以一個新的BoundsNode如果this構建寫new this._classConstructor(...)BoundsNode,和一個新的簡單的Node如果this是純Node