检测重叠形状

我有两个类CircleSquare派生自一个抽象基类Shape

Shape*数组存储指向CircleSquare对象(包括它们在2D网格中的随机位置)的指针。

目标是确定数组中的哪些形状重叠,并且对象本身应该包含计算此方法的方法。 例如, Square类将有方法: bool overlapsWithSquare(Shape s)bool overlapsWithCircle(Shape s)

我的想法是构造两个for循环来比较数组中的每一个形状,但是,我的程序如何知道调用哪个方法,因为我们不知道每个Shape对象的子types是什么?

如果实际types是已知的,我可以在每个对象中有两个虚拟方法, bool overlaps(...)与不同的参数Square sCircle c bool overlaps(...)

我通过简化几何来解决了类似的问题。 在我的情况下,只有一个这样的function: bool overlaps(Shape)

一个形状只是一个浮动列表,并且使用以下逻辑基于该列表在内部切换碰撞逻辑:

  • 只有3个值的形状被认为是一个圆[x, y, radius]
  • 只有4个值的形状被假定为一条线[x1, y1, x2, y2]
  • 具有任何偶数个数> 4的形状是多边形[x1, y1, ... xn, yn]
  • 任何具有奇数个值大于等于5的形状都不是有效的形状

另外值得关注的是分离轴定理。 这是我在物理引擎中使用的。 如果你只使用凸多边形,它效果非常好。

如果您还没有select实际实现overlaps函数的方法,本文对此有所了解,以供我理解: http : //www.metanetsoftware.com/technique/tutorialA.html