Frage

Ich entwerfe gerade ein Programm, das etwas Physik beinhaltet (nichts zu Ausgefallenes, ein paar Bälle, die aufeinander prallen)

Was ist der genaueste Datentyp, den ich zur Darstellung der Position (ohne das Gefühl diskreter Sprünge) in c# verwenden kann?

Und was ist die kleinste Zeitspanne, die ich zwischen t und t+1 erreichen kann?Ein Häkchen?

BEARBEITEN:Klarstellung:Was ist die kleinste Zeiteinheit in C#? [TimeSpan].Tick?

War es hilfreich?

Lösung

In .Net a decimal ist der genaueste Datentyp, den Sie für die Position verwenden können.Ich würde einfach eine Klasse für die Position schreiben:

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

Was die Zeit angeht, kann Ihr Prozessor Ihnen nichts unter einem Tick liefern.

Klingt nach einem lustigen Projekt!Viel Glück!

Andere Tipps

Der Datentyp „Dezimal“ ist zwar präzise, ​​aber je nachdem, was Sie tun möchten, möglicherweise nicht die optimale Wahl.Im Allgemeinen verwenden Direct3D und GPUs 32-Bit-Floats und Vektoren von 3 (insgesamt 96 Bit), um eine Position in x, y, z darzustellen.

Dies führt in der Regel zu mehr als ausreichender Präzision, es sei denn, Sie müssen sowohl große (Planeten) als auch mikroskopische Ebenen (Basketbälle) in derselben „Welt“ mischen.

Gründe für die Nichtverwendung von Dezimalzahlen könnten die Größe (4 x größer), die Geschwindigkeit (um Größenordnungen langsamer) und das Fehlen trigonometrischer Funktionen (AFAIK) sein.

Unter Windows ist die QueryPerformanceCounter Die API-Funktion bietet Ihnen die Uhr mit der höchsten Auflösung QueryPerformanceFrequency die Frequenz des Zählers.Ich glaube, dass die in anderen Kommentaren beschriebene Stoppuhr dies in eine .net-Klasse einschließt.

Sofern Sie keine Raketenwissenschaft betreiben, ist eine Dezimalzahl WAAAY Overkill.Und obwohl es Ihnen möglicherweise genauere Positionen liefert, erhalten Sie nicht unbedingt präzisere (z. B.) Geschwindigkeiten, da es sich um einen Festkomma-Datentyp handelt und daher auf einen viel kleineren Bereich als Float oder Double beschränkt ist.

Verwenden Sie Schwimmer, aber lassen Sie die Tür offen, um auf Doppelgänge zu wechseln, falls sich die Präzision als Problem herausstellen sollte.

Ich würde einen Vektordatentyp verwenden.Genau wie in der Physik verwenden Sie Vektoren, wenn Sie die Bewegung eines Objekts modellieren möchten.Benutze einen Vektor2 oder Vector3-Klasse aus der XNA Rahmen oder rollen Sie Ihren eigene Vector3-Struktur die Position vertreten.Vector2 ist für 2D und Vector3 ist 3D.

Zeitspanne struct oder die Stoppuhr Die beste Möglichkeit zur Berechnung der zeitlichen Veränderung ist die Klasse.Wenn ich es empfehlen müsste, würde ich Stopwatch verwenden.

Ich denke, Sie sollten problemlos mit dem Datentyp Decimal durchkommen.Es verfügt über die höchste verfügbare Präzision.Der Datentyp double sollte jedoch völlig in Ordnung sein.

Ja, ein Häkchen ist das kleinste Häkchen, das mir bekannt ist (unter Verwendung der Klasse System.Diagnostics.Stopwatch).

Ich bin mir nicht sicher, ob ich Ihre letzte Frage verstehe. Könnten Sie das bitte klären?

Bearbeiten:

Ich verstehe es vielleicht immer noch nicht, aber Sie können jeden beliebigen Typ (z. B. Doubles) zur Darstellung der Zeit verwenden (wenn Sie tatsächlich die Diskretisierung der Zeit für Ihr physikalisches Problem darstellen möchten; in diesem Fall ist das Häkchen irrelevant).Für die meisten physikalischen Probleme würden Doppelte ausreichen.

Der Tick ist die höchste Präzision, die Sie bei der Zeitmessung mit Ihrer Maschine erreichen können.

Für eine Simulation ist es wahrscheinlich besser, eine Dezimalzahl/ein Double (gleicher Typ wie Position) für eine dimensionslose Zeit zu verwenden und sie dann bei der Ein-/Ausgabe von/in etwas Sinnvolles umzuwandeln.Andernfalls führen Sie eine Menge Umwandlungsvorgänge durch, wenn Sie Dinge verschieben.Auch auf diese Weise erhalten Sie eine beliebige Präzision, da Sie die Zeitskala so groß/klein wählen können, wie Sie möchten.

Hallo Juan, ich würde empfehlen, dass Sie die Vector3-Klasse verwenden, wie von mehreren anderen vorgeschlagen, da sie einfach zu verwenden ist und vor allem alle Operationen unterstützt, die Sie benötigen (wie Addition, Multiplikation, Matrixmultiplikation usw.), ohne dass eine Implementierung erforderlich ist es selbst.Wenn Sie Zweifel haben, wie Sie vorgehen sollen, übernehmen Sie es und können zu einem späteren Zeitpunkt jederzeit die innere Implementierung ändern oder die Verbindung zu vector3 trennen.

Verwenden Sie auch nicht weniger Genauer als Float - alle Prozessoren werden heutzutage schnell genug ausgeführt, um genauer zu sein als Ganzzahlen (es sei denn Am Ende haben Sie überreiche Rotationen und Übersetzungen, insbesondere wenn Sie mehr als eine einzelne Matrix/Quaternion -Multiplikation verwenden möchten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top