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、ベレ、ミッドポイント、シンプレクティックオイラー、およびおそらくいくつかの半暗黙的/ IMEXまたは暗黙的なものが優れています)。問題は、次の2つのことを行う方法がはっきりとわからないことです。

  1. 各物理オブジェクトは、さまざまな方法で任意の頂点で独自の加速度を計算します(オブジェクトは、ばねまたはある種の拘束オブジェクトを介して接続されたマスポイントで構成されていると見なされます)。この関数はインテグレーターに渡す必要がありますが、オブジェクト固有です。非静的メソッドへのポインタを取得することは可能ですが、これはIIntegratorインターフェイスにどのように適合しますか?

  2. オブジェクトがそのUpdate()メソッドを呼び出すとき、舞台裏で行われるのは、機能を提供するためにインテグレーターが使用されることです。おそらく、その場で統合方法を切り替えたいと思います。または、少なくとも同じ種類のオブジェクトを異なるインテグレータでインスタンス化します。私には、それは工場がそれを行っているように聞こえます、そして、オンザフライのインテグレーター切り替えのために..おそらく戦略パターン?このコンテキストでは、どのソリューションが非常にエレガントで効率的でしょうか?

4

1 に答える 1

2

実装の詳細には触れずに、問題に適用できるいくつかの設計パターンを次に示します。

  • ファクトリまたはプロトタイプ起動時にファイルからオブジェクトを作成するか、実行時にそれらを複製します。
  • 複合PhysicalObjectsこれは、スタンドアロンのオブジェクトとして、または文字列、バネ、または重力によって接続されたコレクションとしてモデル化するために使用できます。
  • イテレーターまたはビジターこれはPhysicsController、すべての物理オブジェクト (複合またはスタンドアロン) を反復処理し、それらに関数を適用するために使用される場合があります。
  • 戦略IIntegrator実行時にさまざまなオブジェクトとそれらの統合関数を選択します。

GoF の本 ( Amazon ) 以外に、優れたオンライン リソースがここにあります。

于 2012-08-15T09:44:28.013 に答える