2012-08-15 70 views
4

我认为这个脚本对象:对象大致是这样的:添加数值积分到更新自己的身体状态

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. 每个物理对象在其任何以不同的方式顶点的计算自己的加速度(考虑对象包括通过弹簧连接masspoints的或某种约束对象)。这个函数必须传递给积分器,但它是特定于对象的。有可能获得指向非静态方法的指针,但这将如何适合IIntegrator接口?

  2. 当一个对象调用它的Update()方法时,幕后会发生什么情况是使用集成器来提供功能。或许,我想立即切换集成方法。或者至少用不同的集成商实例化相同类型的对象。对我来说,这听起来像是一家工厂,为了即时集成商切换..也许是一种战略模式?在这种情况下,什么解决方案会非常优雅和高效?

+1

这本书http://www.amazon.co.uk/Scientific-Software-Design-Object-Oriented-Way/ dp/0521888131/ref = sr_1_1?s = books&ie = UTF8&qid = 1345024376&sr = 1-1可能会引起您的兴趣。我推荐它。 – 2012-08-15 09:54:08

回答

2

没有进入实施细节,这里有可能适用于您的问题

  • 原型从文件在启动时创建的对象的几个设计模式,或克隆他们分别在运行期间。
  • 复合这可能用于模拟PhysicalObjects,可以作为独立对象或通过字符串,弹簧或重力连接的集合。
  • 迭代游客这可能是由PhysicsController用于遍历所有的物理对象(复合或独立),并在他们应用的功能。
  • 策略在运行时选择不同的IIntegrator对象及其集成函数。

除了GoF的书(Amazon),一个良好的网上资源是here

+0

简明扼要,感谢提示! – teodron 2012-08-15 10:41:52

+1

@teodron我是受教育的物理学家,所以你的问题回到了一些回忆:-) – TemplateRex 2012-08-15 10:42:59