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