C++中用于碰撞检测的多个调度
Multiple dispatch for collision detection in C++?
我有圆圈、方框和线条。现在我想在它们之间实现碰撞检测。这意味着我必须为两种形状的每种组合都有一个函数。当然,我可以对线与圆和圆对线使用相同的方法,但我认为我的观点仍然成立。在C++中实现这一点的最优雅方法是什么?
在现代C++设计一书中,多方法一章解释了如何实现它们,并记录了如何使用[Loki库提供的实现][2]。还有Boost.Multimethod提案,但还没有。这本书在对象碰撞的主题上展示了多方法的力量。
多态性
首先,您有 Shape
和所有其他子类:
class Shape;
class Circle : Shape;
class Square : Shape;
...etc
并且您希望它们都实现彼此相交,因此具有一个通用函数:
class Shape{
bool isIntersect(const Shape&)
{
return isIntersecting(this, shape);
}
};
现在重载与所有配对选项相交,因为每个情况都是唯一的,你在这里没有太多选择,只能实现每个情况:
bool isIntersecting(Circle, Square);
bool isIntersecting(Circle, Line);
...
你也可以尝试访客模式,但我认为它在这里没有用。
您可以在场景中执行碰撞检测,而不是处理两个形状的每个事件。此外,您将面临一些问题。其中包括类型省略和注册几何形状:
#include <iostream>
#include <map>
class Shape
{
public:
struct Type {
public:
typedef unsigned Identifier;
const char* name;
Identifier id;
Type(const char* name)
: name(name), id(register_name(name))
{}
private:
static Identifier register_name(const char*);
};
virtual const Type& get_type() const = 0;
virtual ~Shape() {}
};
Shape::Type::Identifier Shape::Type::register_name(const char* name) {
typedef std::map<const char*, Identifier> Types;
static std::map<const char*, Identifier> types;
auto& id = types[name];
if( ! id) id = types.size();
return id;
}
class Scene
{
public:
typedef bool (*CollisionDetector)(const Shape&, const Shape&);
void register_collision_detector(CollisionDetector, const Shape::Type&, const Shape::Type&);
bool collision(const Shape& a, const Shape&, bool strict = false) const;
private:
typedef std::pair<Shape::Type::Identifier, Shape::Type::Identifier> Identifier;
typedef std::map<Identifier, CollisionDetector> CollisionDetectors;
CollisionDetectors m_detectors;
};
void Scene::register_collision_detector(
CollisionDetector detector,
const Shape::Type& t0,
const Shape::Type& t1)
{
m_detectors[Identifier(t0.id, t1.id)] = detector;
}
bool Scene::collision(const Shape& s0, const Shape& s1, bool strict) const {
const Shape::Type::Identifier i0 = s0.get_type().id;
const Shape::Type::Identifier i1 = s1.get_type().id;
auto pos = m_detectors.find(Identifier(i0, i1));
if(pos == m_detectors.end() && ! strict && i0 != i1)
pos = m_detectors.find(Identifier(i1, i0));
if(pos != m_detectors.end())
return pos->second(s0, s1);
else return false;
}
class Circle : public Shape
{
public:
static const Type type;
virtual const Type& get_type() const { return type; }
};
const Shape::Type Circle::type("Circle");
class Rectangle : public Shape
{
public:
static const Type type;
virtual const Type& get_type() const { return type; }
};
const Shape::Type Rectangle::type("Rectangle");
bool circle_rectangle_collision(const Shape& circle, const Shape& rectangle) {
std::cout << "circle_rectangle_collision" << std::endl;
return false;
}
int main()
{
Scene scene;
scene.register_collision_detector(circle_rectangle_collision, Circle::type, Rectangle::type);
Circle circle;
Rectangle rectangle;
scene.collision(circle, rectangle);
scene.collision(rectangle, circle);
}
相关文章:
- 落砂模拟碰撞检测C++和SFML
- SFML 中的重力和碰撞检测
- 我的碰撞检测中的奇怪行为
- 如何为球形物体和三角形地形提供高效的碰撞检测和响应
- 圆形与方形碰撞检测以及需要响应C++ |OpenGL。我的问题就是这个"I need to keep the circle outside the square"
- 在Qt3D中进行碰撞检测的预期方法(或好方法)是什么?
- 在碰撞检测方面苦苦挣扎.如何正确检测碰撞?
- 三角形-三角形碰撞检测问题
- 不同类别之间的C SFML碰撞检测
- 使用D3DXVECTOR C 的碰撞检测,发生碰撞后该怎么办
- 当我发生碰撞检测时,矢量迭代器不兼容
- 如何使用灵活的碰撞库在两个点云或点云与机器人末端执行器模型之间进行碰撞检测
- 优化碰撞检测C
- 使用碰撞检测来增加SFML 2.4中的游戏分数的问题
- 使用OnComponentHit UE4 C++进行碰撞检测
- 体素世界中的碰撞检测
- 如何在 2D 碰撞检测中正确解析碰撞的位置?
- (中广)获取AABB树生成的边界立方体进行碰撞检测
- C++中用于碰撞检测的多个调度
- 调度重生在碰撞检测中返回错误