質問
私は現在、いくつかの物理学を含むプログラムを設計しています (あまり派手なことはせず、いくつかのボールが互いに衝突する程度です)。
C# で (離散的なジャンプを感じさせずに) 位置を表すために使用できる最も正確なデータ型は何ですか?
また、t から t+1 までに取得できる最小時間はどれくらいですか?1ティック?
編集:明確にする:C# における時間の最小単位は何ですか? [TimeSpan].Tick
?
解決
.Netでは decimal
は、位置に使用できる最も正確なデータ型になります。この位置のクラスを作成するだけです。
public class Position
{
decimal x;
decimal y;
decimal z;
}
時間に関しては、プロセッサーは 1 ティックより小さい値を与えることはできません。
楽しいプロジェクトのようですね!幸運を!
他のヒント
Decimal データ型は正確ではありますが、やりたいことによっては最適な選択ではない場合があります。一般に、Direct3D と GPU は、32 ビット浮動小数点数と 3 のベクトル (合計 96 ビット) を使用して、x、y、z の位置を表します。
同じ「世界」内に巨大なスケール (惑星) と微視的なレベル (バスケットボール) の両方を混在させる必要がない限り、通常はこれで十分以上の精度が得られます。
Decimals を使用しない理由としては、サイズ (4 倍大きい)、速度 (桁違いに遅い)、および使用できる三角関数がないことが考えられます (私の知る限り)。
Windows では、 QueryPerformanceCounter API 関数は最高の解像度のクロックを提供します。 クエリパフォーマンス頻度 カウンタの周波数。他のコメントで説明されているストップウォッチは、これを .net クラスでラップしていると思います。
ロケット科学をやっているのでなければ、小数というのはとんでもなくやりすぎです。また、より正確な位置が得られるかもしれませんが、固定小数点データ型であるため、float や double よりもはるかに狭い範囲に制限されるため、必ずしもより正確な (たとえば) 速度が得られるわけではありません。
float を使用しますが、精度に問題があることが判明した場合に備えて、ドアを開いたままにして double まで移動します。
私なら Vector データ型を使用します。物理学と同じように、オブジェクトの動きをモデル化する場合はベクトルを使用します。使う ベクター2 または XNA の Vector3 クラス フレームワークまたはロール 独自の Vector3 構造体 立場を表すため。Vector2 は 2D 用、Vector3 は 3D 用です。
期間 構造体または ストップウォッチ class は、時間の変化を計算するための最良のオプションになります。強いて勧めるなら、ストップウォッチを使います。
Decimal データ型を問題なく使用できるはずだと思います。入手可能な中で最も精度が高いです。ただし、double データ型でも問題ありません。
はい、目盛りは私が知る限り最小のものです (System.Diagnostics.Stopwatch クラスを使用)。
最後の質問を理解できたかどうかわかりませんが、説明していただけますか?
編集:
まだ理解できないかもしれませんが、時間を表すために任意の型 (double など) を使用できます (実際に物理問題の時間の離散化を表す場合、その場合、目盛りは無関係です)。ほとんどの物理問題では double で十分です。
目盛りは、機械で時間を測定するときに達成できる最高の精度です。
シミュレーションの場合は、無次元時間に 10 進数/倍精度 (位置と同じ型) を使用し、入出力で意味のあるものとの間で変換する方がよいでしょう。そうしないと、物を移動するときに大量のキャスト操作を実行することになります。タイムスケールを必要に応じて大きく/小さく選択できるため、この方法でも任意の精度が得られます。
フアンさん、他の人が提案しているように、Vector3 クラスを使用することをお勧めします。これは使いやすく、何よりも実装する必要がなく、必要なすべての演算 (加算、乗算、行列の乗算など) をサポートしているためです。それは自分自身です。続行方法に疑問がある場合は、それを継承し、後の段階でいつでも内部実装を変更したり、vector3 から切断したりできます。
また、フロートよりも正確ではないものを使用しないでください - 最近のすべてのプロセッサは、整数よりも正確になるほど速く実行されます(モバイル向けではない限り...)フロート未満を使用すると、非常に速く精度を失い、特に、単一のマトリックス/Quaternionの乗算を使用する場合は、びくびくした回転と翻訳になります。