2008-08-26 12 views
9

Actualmente estoy diseñando un programa que va a implicar algo de física (pero nada de lujos, algunas bolas chocando entre sí)tipos de datos para la física

¿Cuál es el tipo de datos más exacta que pueda usar para la posición representar (sin un sentimiento de saltos discretos) en C#?

Además, ¿cuál es la menor cantidad de tiempo que puedo obtener entre t y t + 1? Un tic?

EDIT: Aclaración: ¿Cuál es la unidad de tiempo más pequeña en C#? [TimeSpan].Tick?

Respuesta

8

En .Net a decimal será el tipo de datos más preciso que podría utilizar para la posición. Me acaba de escribir una clase para la posición:

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

En cuanto al tiempo, su procesador no puedo darle algo más pequeño que un tick.

¡Suena como un proyecto divertido! ¡Buena suerte!

+1

-1: Los decimales rara vez se utilizan en los cálculos de juegos en 3D, son demasiado lentos. Usa una clase Vector construida con 3 flotadores y ya estás listo. –

+1

+1: para tipos reales, el decimal es el más preciso y eso es lo que se solicitó. – Rusty

0

No estoy seguro de entender su última pregunta, ¿podría aclarar?

Editar:

todavía no podría entender, pero se puede utilizar cualquier tipo que desee (por ejemplo, se duplica) para representar el tiempo (si es lo que realmente quiere es representar la discretización de tiempo para su problema de la física , en cuyo caso la marca es irrelevante). Para la mayoría de los problemas de física, los dobles serían suficientes.

El tic es la mejor precisión que puede lograr al medir el tiempo con su máquina.

0

Creo que debería poder salirse con la suya con el tipo de datos Decimal sin ningún problema. Tiene la mayor precisión disponible. Sin embargo, el tipo de datos doble debería estar bien.

Sí, un tic es el más pequeño que conozco (utilizando la clase System.Diagnostics.Stopwatch).

0

Para una simulación, probablemente sea mejor utilizar un decimal/doble (el mismo tipo de posición) para un tiempo adimensional, y luego convertirlo de/a algo significativo en la entrada/salida. De lo contrario, realizarás una tonelada de operaciones de lanzamiento cuando muevas las cosas. Obtendrá precisión arbitraria de esta manera, también, porque puede elegir que la escala de tiempo sea lo más grande/pequeña que desee.

9

El tipo de datos Decimal, aunque preciso, puede no ser la opción óptima según lo que desee hacer. En general, Direct3D y GPU utilizan flotantes de 32 bits y vectores de 3 (96 bits en total) para representar una posición en x, y, z.

Esto generalmente dará precisión más que suficiente a menos que necesite mezclar a gran escala (planetas) y nivel microscópico (balones de baloncesto) en el mismo "mundo".

Razones para no usar Decimales podrían ser tamaño (4 veces más grande), velocidad (órdenes de magnitud más lentas) y no tener funciones trigonométricas disponibles (AFAIK).

En Windows, la función API QueryPerformanceCounter le dará el reloj con la resolución más alta, y QueryPerformanceFrequency la frecuencia del contador. Creo que el cronómetro descrito en otros comentarios lo envuelve en una clase .net.

+0

Sí, porque todos saben que los balones son microscópicos. – sep332

+1

+1: Un vector construido con 3 flotadores es bastante estándar en D3D. No usaría decimales a menos que necesitaras una mayor precisión, pero si solo es un juego, no me preocuparía. –

3

Utilizaría un tipo de datos Vector.Al igual que en Física, cuando quieres modelar un movimiento de objetos, usas vectores. Utilice un marco Vector2 o Vector3 class out of the XNA o haga rodar su own Vector3 struct para representar la posición. Vector2 es para 2D y Vector3 es 3D.

TimeSpan struct o la clase Stopwatch serán sus mejores opciones para calcular el cambio en el tiempo. Si tuviera que recomendarlo, usaría Cronómetro.

0

Hola Juan, te recomiendo que uses la clase Vector3 como sugieren otros muchos, ya que es fácil de usar y, sobre todo, admite todas las operaciones que necesites (como suma, multiplicación, multiplicación de matriz, etc.) sin la necesidad de implementarlo usted mismo. Si tiene alguna duda sobre cómo proceder, hágalo y, en una etapa posterior, siempre podrá cambiar la implementación interna o desconectarse del vector3.

Además, no use nada menos preciso que flotar: todos los procesadores en estos días funcionan lo suficientemente rápido como para ser más precisos que los enteros (a menos que sea para dispositivos móviles, pero incluso allí ...) Usando menos de flotación, pierda la precisión muy rápido y termine con rotaciones y traducciones turbias, especialmente si planea usar más de una simple multiplicación de matriz/cuaternión.

5

A menos que esté haciendo ciencia de cohetes, un decimal es WAAAY excesivo. Y aunque podría darle posiciones más precisas, no necesariamente le dará velocidades más precisas (por ejemplo), ya que es un tipo de datos de punto fijo y, por lo tanto, está limitado a un rango mucho más pequeño que un flotante o doble.

Use flotadores, pero deje la puerta abierta para moverse hasta el doble en caso de que la precisión resulte ser un problema.

Cuestiones relacionadas