gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 00:50:14 25 4
gpt4 key购买 nike

我有这种情况:

 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com