これは、これに対するもう1つの質問です。
描画領域(現在は800x600ピクセル)に合わせるために、世界の表現(現在は160Kmx160Km)をスケーリングするための一般的/典型的/最良のパターンがあるかどうかを知りたいです。
私は少なくとも4つの異なるアプローチを考えることができます。
ナイーブ(これまでのやり方)sc(vector)
渡されたベクトルの縮小されたコピーを返すだけのグローバル関数を実装しました。もちろんこれは機能しますが、次のようなコードを書く必要があります。
drawCircle(sc(radius), sc(position))
ラッピング関数。私はいくつかの関数を定義でき、それぞれが元のミドルウェアの関数をラップしています。たとえば、myDrawCircle
最初にスケーリングが必要な引数をスケーリングし、次にdrawCircle
後者を呼び出すように定義できます。これにより、コードが読みやすくなり、メンテナンスが容易になりますが、馬鹿げているように思える多くのラッピング関数を作成する必要があります。
関数デコレータ。既存のミドルウェア関数を装飾して、クラスのインスタンス化であるすべてのパラメーターに自動スケーリングを提供することもできますVector3D
が、問題はこれらの関数も同じパラメーターで動作list
するVector2D
ことであり、デコレーターは知る方法がありません。スケーリングする必要があるリスト(半径など)とスケーリングしないリスト(RGB値)。
表面の初期化。描画する表面を定義するときに、倍率を定義できます(そのため、パラメーターとしてピクセルではなくメートルを使用します)。これは私にとって透過的に機能し、私の選択するソリューションになりますが、もちろんミドルウェアに実装する必要があるため、実際のオプションではありません。
...とにかく、これは非常に一般的な問題なので、見つけられなかったこの問題をエレガントに解決する確立されたパターンがあるのだろうか。
PS:このプロジェクトではpython(pygameを使用)を使用していますが、python / pygame固有の回答は非常に高く評価されていますが、具体的な実装ではなく、パターンの一般的/高レベルの説明に興味があります。
あなたの時間と専門知識を事前にありがとう。