2014-08-27 60 views
2

我在指定的空间中有一组矩形,它们可以有不同的尺寸和位置。矩形重叠的数据结构

我需要检测碰撞簇,彼此相交的矩形组,如附图所示,其中我有两个簇(红框)。

琐碎的方法是让这些矩形的载体,以双循环for交叉检查,像什么

for (size_t i = 0; i < rectangles.size(); i++) { 
    for (size_t j = i + 1; j < rectangles.size(); j++) { 
    if (rectangles.at(i).intersect(rectangles.at(j)) { 
     // Add rectangle[j] to cluster in which rectangle[i] is 
    } 
    } 

我不认为这是为了执行结石最有效的方法。

如何有效计算这些簇?我已经阅读了有关使用四叉树的平面分区的一些内容,但我不知道在这种情况下如何使用它们。这是合适的数据结构还是更有效的方法(我必须在软实时处理它)。

I have two clusters (grouped in red)

+0

http://en.wikipedia.org/wiki/Collision_detection – 2014-08-27 13:46:12

+0

相关:http://stackoverflow.com/q/5880558/951890 – 2014-08-27 13:51:02

+0

@VaughnCato R-Tree是我的问题的正确选择,你同意吗?我犯了一个错误? – Jepessen 2014-08-27 13:57:46

回答

3

如果情况允许的情况下,使用quad tree是肯定是一个良好的通话,但请确保您有结构值得的创建和维护的开销足够的对象。

除此之外,如果您只是使用矩形,则可以简单检查一个矩形的最大X值与另一个的最小X值以及Y的相同。如果没有,并且您没有使用凹面物体,那么separating axis theorem是一种很好的检测方法,如果足够的话,它甚至可以拉伸3d。我非常喜欢关于分离轴定理的一件事,那就是如果你需要它也会碰撞响应,因为它可以返回最小向量来移动形状。

game-dev上的某些人如果遇到困难,将会对进一步的碰撞检测和响应提供大量指示。

+0

谢谢。我知道如何进行矩形碰撞,但我不知道什么是最好的数据结构,以尽量减少碰撞测试。我已经看到@VaughnCato告诉我使用R-tree数据结构和分离轴定理,我应该获得良好的性能。 – Jepessen 2014-08-27 14:00:04

+0

够公平的。请记住,如果对象不容易被矩形限制,那么分离轴定理相当可能只会更好,因为您将获得更高的碰撞准确性。虽然效率很高,但并不像简单的大于/小于检查那么快。 @Jepessen – Yann 2014-08-27 14:03:24

+0

好的,我会牢记它。谢谢。 – Jepessen 2014-08-27 14:04:21