10

私は現在、いくつかの物理学を含むプログラムを設計しています(あまりにも空想的ではなく、いくつかのボールが互いに衝突します)

c# で位置を表すために使用できる最も正確なデータ型は何ですか (離散ジャンプの感覚なし)?

また、t から t+1 までの間に得られる最小時間はどれくらいですか? 1ティック?

編集: 明確化: C# の時間の最小単位は何ですか? [TimeSpan].Tick?

4

8 に答える 8

9

Decimal データ型は正確ですが、目的によっては最適な選択ではない場合があります。一般に、Direct3D と GPU は 32 ビットの浮動小数点数と 3 つのベクトル (合計 96 ビット) を使用して、x、y、z の位置を表します。

同じ「世界」で巨大なスケール (惑星) と微視的なレベル (バスケットボール) の両方を混在させる必要がない限り、通常はこれで十分な精度が得られます。

Decimals を使用しない理由は、サイズ (4 倍大きい)、速度 (桁違いに遅い)、三角関数が利用できない (AFAIK) などです。

Windows では、QueryPerformanceCounter API 関数が最高解像度のクロックを提供し、 QueryPerformanceFrequencyがカウンターの周波数を提供します。他のコメントで説明されているストップウォッチは、これを .net クラスにラップしていると思います。

于 2008-08-26T19:57:59.147 に答える
9

.Net ではdecimal、位置に使用できる最も正確なデータ型は a になります。ポジションのクラスを書くだけです:

public class Position
{
    decimal x;
    decimal y;
    decimal z;
}

時間に関しては、プロセッサは 1 ティックよりも小さいものを提供することはできません。

楽しいプロジェクトのようですね!幸運を!

于 2008-08-26T19:27:49.203 に答える
5

あなたがロケット科学をしているのでない限り、小数はWAAAYやり過ぎです。また、より正確な位置が得られる可能性がありますが、必ずしもより正確な (たとえば) 速度が得られるとは限りません。これは、固定小数点データ型であり、float や double よりもはるかに小さい範囲に制限されているためです。

フロートを使用しますが、精度が問題になる場合に備えて、ドアを開いたままにしてダブルスに移動します。

于 2008-09-19T18:10:02.237 に答える
3

Vector データ型を使用します。物理学と同じように、オブジェクトの動きをモデル化する場合はベクトルを使用します。XNAフレームワークのVector2またはVector3 クラスを使用するか、独自の Vector3 構造体をロールして位置を表します。Vector2 は 2D 用で、Vector3 は 3D 用です。

TimeSpan構造体またはStopwatchクラスは、時間の変化を計算するための最良のオプションになります。お勧めするならストップウォッチです。

于 2008-08-26T22:47:17.290 に答える
0

最後の質問がよくわかりません。明確にしていただけますか。

編集:

まだ理解できないかもしれませんが、任意の型 (たとえば double) を使用して時間を表すことができます (実際に必要なのは、物理問題の時間の離散化を表すことであり、この場合、ティックは無関係です)。ほとんどの物理問題では、double で十分です。

ティックは、マシンで時間を測定するときに達成できる最高の精度です。

于 2008-08-26T19:26:42.670 に答える
0

Decimal データ型を問題なく使用できるはずです。利用できる精度が最も高いです。ただし、 double データ型は問題ありません。

はい、ティックは私が認識している最小のものです (System.Diagnostics.Stopwatch クラスを使用)。

于 2008-08-26T19:28:22.040 に答える
0

シミュレーションでは、無次元の時間に decimal/double (position と同じ型) を使用してから、入出力で意味のあるものとの間で変換した方がよいでしょう。そうしないと、物を移動するときに大量のキャスト操作を実行することになります。タイムスケールを好きなだけ大きく/小さく選択できるため、この方法でも任意の精度が得られます。

于 2008-08-26T19:35:47.763 に答える
0

Juan さん、Vector3 クラスは使いやすく、何よりも、必要なすべての操作 (加算、乗算、行列乗算など) を実装する必要なくサポートするため、他のいくつかの提案に従って使用することをお勧めします。それを自分で。続行する方法について疑問がある場合は、それを継承し、後の段階でいつでも内部実装を変更するか、vector3 から切断することができます。

また、float よりも精度の低いものは使用しないでください。最近のすべてのプロセッサは、整数よりも正確であるほど高速に実行されます (モバイル向けである場合を除きますが、それでも...) float 未満を使用すると、精度が非常に速く失われ、特に複数の行列/四元数の乗算を使用する予定がある場合は、回転と移動が不安定になります。

于 2008-09-17T17:39:03.413 に答える