【问题标题】:Adding numerical integration to objects that update their physical state向更新其物理状态的对象添加数值积分
【发布时间】:2012-08-15 08:23:40
【问题描述】:

我考虑过这种情况:对象大致如下:

class PhyisicalObject
{
  private:
  virtual void Update() = 0;
  friend class PhysicsController;
  void DoUpdate() { this->Update(); }
};

有一个称为PhysicsController 的控制器类,它通过调用它们的DoUpdate() 方法来管理物理对象池的动态。就术语而言,此方法调用Update()函数的重载版本,其中使用数值积分器逐步计算对象的位置、速度和加速度。我认为拥有一个暗示此功能的接口将是一个很好的起点:

class IIntegrator
{
  virtual void opertor() (const vec3& pos, const vec3& vel, vec3& outPos, vec3& outVel);
};

现在继承这个IIntegrator 抽象类并提供各种方法的实现是下一步(显式欧拉、RK4、Verlet、中点、辛欧拉,也许一些半隐式/IMEX 或隐式的会很好)。问题是我看不清楚如何做以下两件事:

  1. 每个物理对象以不同的方式计算其任何顶点处的加速度(考虑到对象由通过弹簧或某种约束对象连接的质点组成)。此函数必须传递给积分器,但它是特定于对象的。可以获得指向非静态方法的指针,但这如何适应IIntegratorinterface?

  2. 当一个对象调用它的Update() 方法时,幕后发生的事情是使用了一个积分器来提供功能。也许我想即时切换集成方法。或者至少用不同的积分器实例化同一种对象。对我来说,这听起来像是一个工厂在做这件事,而且对于即时集成商切换……也许是一种策略模式?在这种情况下,哪种解决方案会非常优雅和高效?

【问题讨论】:

标签: c++ design-patterns numerical-methods


【解决方案1】:

在不讨论实现细节的情况下,这里有一些可能适用于您的问题的设计模式

  • FactoryPrototype 分别在启动时从文件创建对象,或在运行时克隆它们。
  • 复合 这可用于对 PhysicalObjects 建模,可以作为独立对象或通过字符串、弹簧或重力连接的集合。
  • IteratorVisitor 这可能被PhysicsController 用来迭代所有物理对象(复合或独立)并对其应用函数。
  • 策略 在运行时选择不同的IIntegrator 对象及其集成函数。

除了 GoF 书 (Amazon),一个很好的在线资源是 here

【讨论】:

  • @teodron 我是受过教育的物理学家,所以你的问题让我想起了一些回忆:-)
猜你喜欢
  • 2020-04-07
  • 2020-08-05
  • 1970-01-01
  • 1970-01-01
  • 2020-03-05
  • 2020-07-01
  • 2021-06-15
  • 2016-02-08
相关资源
最近更新 更多