c++ - 如何在不转换为派生类的情况下检查几何基类中的碰撞

标签 c++ inheritance design-patterns collision-detection

我有这种情况:

 class Shape{};
 class Triangle : public Shape{};
 class Rectangle : public Shape{};
 class Square : public Rectangle{};

我想在以这种方式工作的基类中实现一个 virtual collideWith 方法:

Shape *square = new Square();
Shape *triangle = new Triangle();

bool test = square.collideWith(triangle);

有没有一种方法可以实现此方法,以便在不对派生类进行显式转换的情况下使用基类?

我想创建一个命名空间来完成它:

namespace Collision {
  bool isCollisionBetween(const Triangle &triangle, const Square &square) {/* calculus */}
  bool isCollisionBetween(const Rectangle &rect, const Square &square) {/* calculus */}
  // and so on for all combination
}

但是当我有类似的东西时,我不知道如何应用它

std::set<Shape*> shapesSet;

我想计算这个集合的所有碰撞。

是否有可能或者总是有必要将 Shape 类显式转换为正确的继承类?

最佳答案

一般来说,您会按如下方式解决这样的问题:

  1. Shape 一个描述形状的抽象函数,每个子类都必须实现它。
  2. 每个子类根据其具体类型实现此功能。
  3. Shape中的一个collideWith()函数使用了两种类型的抽象函数来确定属性。

这样,当添加一个形状时,不需要更改任何其他形状,您也不必添加函数来将它与其他形状进行比较。只有新形状必须为所有必需的属性提供功能。

现在困难的部分是决定每个形状可以提供什么属性。在您的情况下,可能很难为其提供有效的实现。

可用于提供碰撞检测的属性示例如下:

  1. polygonRepresentation()
  2. asVectorGrahpic()
  3. convertToBitMap()

如您所想,在您的问题中,可能很难找到适合每个项目的适当表示。然后你可能不得不恢复到知道所有元素的比较。但这实际上是一种反面向对象的模式,并且当形状或属性的数量增加时会导致麻烦。

关于c++ - 如何在不转换为派生类的情况下检查几何基类中的碰撞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25721262/

相关文章:

c++ - Lambda 捕获 QFile 对象

typescript - 在 TypeScript 中键入由继承方法调用的重写方法(错误?)

java - 包中的继承

design-patterns - 应用程序启动代码设计

java - 包装 UI 组件的模式

c++ - 是否可以 move boost::optional ?

c++ - 对 STL::抽象数据类型列表进行排序

c++ - 在 C++ 中使用 std::algorithm 输出 `std::multiset` 的唯一元素及其频率(无循环)

javascript - 访问任意父类(super class)中声明的属性

java - 我应该如何设计我的 restful API 以通过 POST 以不同格式(JSON、CSV)接受数据以达到相同目的?