Question

Je suis actuellement en train de concevoir un programme qui va impliquer la physique (rien de trop de fantaisie, un peu de ballons à s'écraser les uns les autres)

Ce qui est le plus exact, le type de données que je peux utiliser pour représenter la position (sans un sentiment de sauts discrets) en c#?

Aussi, quelle est la plus petite quantité de temps je peux obtenir entre t et t+1?Une tique?

EDIT:Clarifier:Quelle est la plus petite unité de temps en C#? [TimeSpan].Tick?

Était-ce utile?

La solution

Dans .Net un decimal sera la plus précise du type de données que vous pouvez utiliser pour la position.Je voudrais juste écrire une classe pour la position:

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

Que de temps, de votre processeur ne peux pas vous donner quelque chose de plus petit qu'un tick.

Sonne comme un projet amusant!Bonne chance!

Autres conseils

Le type de données Décimal bien précise peut ne pas être le meilleur choix en fonction de ce que vous voulez faire.Généralement Direct3D et Gpu utiliser 32 bits float, et les vecteurs de 3 (total de 96 bits) pour représenter une position en x,y,z.

Il s'agit généralement de donner plus de suffisamment de précision, sauf si vous avez besoin de mélanger à la fois très grande échelle (planètes) et à l'échelle microscopique (basket-ball) dans le même "monde".

Raisons pour ne pas utiliser les Décimales pourrait être de taille (4 x plus), la vitesse (ordres de grandeur de la vitesse) et pas de fonctions trigonométriques disponible (autant que je sache).

Sur Windows, l' QueryPerformanceCounter La fonction de l'API qui va vous donner la plus haute résolution de l'horloge, et QueryPerformanceFrequency la fréquence du compteur.Je crois que le Chronomètre est décrit dans d'autres commentaires encapsule ce dans un .net de la classe.

Sauf si vous êtes en train de faire fusée-science, une virgule est WAAAY trop.Et bien qu'il puisse vous donner plus de précision les positions, il ne sera pas nécessairement vous donner plus de précision (par exemple) les vitesses, car il est un point fixe de type de données et, par conséquent, est limitée à un éventail beaucoup plus petite qu'un float ou double.

Utiliser des flotteurs, mais de laisser la porte ouverte pour aller jusqu'au double en cas de précision s'avère être un problème.

Je voudrais utiliser un Vecteur de type de données.Tout comme en Physique, quand vous voulez le modèle d'un mouvement d'objet, vous devez utiliser des vecteurs.L'utilisation d'un Vector2 ou Vector3 classe de XNA cadre ou rouler vos propre Vector3 struct pour représenter la position.Vector2 est pour la 2D et Vector3 est en 3D.

TimeSpan struct ou l' Chronomètre classe seront vos meilleures options pour le calcul de la variation dans le temps.Si je devais recommander, je voudrais utiliser un Chronomètre.

Je pense que vous devriez être en mesure de sortir avec le type de données Décimal sans problème.Il a le plus de précision disponible.Cependant, le type de données double devrait être très bien.

Oui, un tick est la plus petite que j'suis au courant (à l'aide du Système.Diagnostics.Chronomètre de classe).

Je ne suis pas sûr de comprendre votre dernière question, pourriez-vous préciser?

Edit:

Je risque de ne pas comprendre, mais vous pouvez utiliser n'importe quel type que vous souhaitez (par exemple, les doubles) pour représenter le temps (si ce que vous voulez vraiment est de représenter la discrétisation du temps pour votre problème de physique, auquel cas la tique est sans importance).Pour la plupart des problèmes de physique, double serait suffisant.

La tique est le meilleur précision que vous pouvez obtenir lors de la mesure du temps avec votre machine.

Pour une simulation, vous êtes probablement mieux d'utiliser une virgule/double (même type de poste) pour adimensionnel temps, puis de les convertir à partir de/à quelque chose de significatif sur l'entrée/sortie.Sinon, vous devez effectuer une tonne de fonte des opérations lorsque vous bouger les choses.Vous obtiendrez une précision arbitraire de cette façon, aussi, parce que vous pouvez choisir l'échelle de temps pour être aussi grand/petit que vous le souhaitez.

Hey Juan, je recommande que vous utilisez le Vector3 classe comme suggéré par plusieurs autres, car il est facile à utiliser et surtout - prend en charge toutes les opérations dont vous avez besoin (comme l'addition, la multiplication, la matrice de multiplier etc...) sans la nécessité de mettre en œuvre vous-même.Si vous avez un doute sur la façon de procéder - en hériter et ultérieurement, vous pouvez toujours changer l'intérieur de la mise en œuvre, ou de la déconnexion de vector3.

Aussi, ne pas utiliser quoi que ce soit moins précis que les float - tous les processeurs de ces jours est assez rapide pour être plus précis que les entiers (à moins que cela signifiait pour mobile, mais même là...) En utilisant moins de flotteur vous ne voudriez pas perdre de précision très rapide et nerveux rotations et des translations, surtout si vous prévoyez d'utiliser plus d'une seule matrice/la multiplication des quaternions.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top