Pregunta

Actualmente estoy diseñando un programa que involucrará algo de física (nada demasiado sofisticado, algunas bolas chocando entre sí)

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

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

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

¿Fue útil?

Solución

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

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

En cuanto al tiempo, su procesador no puede darle nada menor que un tic.

¡Suena como un proyecto divertido!¡Buena suerte!

Otros consejos

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

Por lo general, esto dará una precisión más que suficiente a menos que necesite mezclar tanto a gran escala (planetas) como a nivel microscópico (pelotas de baloncesto) en el mismo "mundo".

Las razones para no usar decimales podrían ser el tamaño (4 veces más grande), la velocidad (órdenes de magnitud más lentas) y la falta de funciones trigonométricas disponibles (AFAIK).

En Windows, el Contador de rendimiento de consultas La función API le brindará el reloj de mayor resolución y ConsultaRendimientoFrecuencia la frecuencia del contador.Creo que el cronómetro descrito en otros comentarios incluye esto en una clase .net.

A menos que estés haciendo ciencia espacial, un decimal es MUY exagerado.Y aunque podría brindarle posiciones más precisas, no necesariamente le brindará (por ejemplo) velocidades más precisas, 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 un doble.

Utilice flotadores, pero deje la puerta abierta para subir a dobles en caso de que la precisión resulte ser un problema.

Usaría un tipo de datos vectorial.Al igual que en Física, cuando quieres modelar el movimiento de un objeto, utilizas vectores.Usar una Vector2 o Clase Vector3 fuera del XNA marco o enrollar su propia estructura Vector3 para representar la posición.Vector2 es para 2D y Vector3 es 3D.

Espacio de tiempo estructura o el Cronógrafo La clase será su mejor opción para calcular el cambio en el tiempo.Si tuviera que recomendarlo, usaría Stopwatch.

Creo que deberías poder utilizar el tipo de datos decimal sin problemas.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 (usando la clase System.Diagnostics.Stopwatch).

No estoy seguro de haber entendido tu última pregunta, ¿podrías aclararla?

Editar:

Puede que todavía no lo entienda, pero puedes usar cualquier tipo que quieras (por ejemplo, dobles) para representar el tiempo (si lo que realmente quieres es representar la discretización del tiempo para tu problema de física, en cuyo caso el tick es irrelevante).Para la mayoría de los problemas de física, los dobles serían suficientes.

El tick es la mejor precisión que puedes conseguir a la hora de medir el tiempo con tu máquina.

Para una simulación, probablemente sea mejor usar un decimal/doble (mismo tipo que la posición) durante un tiempo adimensional y luego convertirlo de/a algo significativo en la entrada/salida.De lo contrario, realizarás un montón de operaciones de lanzamiento cuando muevas las cosas.De esta manera también obtendrás precisión arbitraria, porque puedes elegir que la escala de tiempo sea tan grande o pequeña como quieras.

Hola Juan, te recomendaría que uses la clase Vector3 como lo sugieren varios otros, ya que es fácil de usar y, sobre todo, admite todas las operaciones que necesitas (como suma, multiplicación, multiplicación de matrices, etc.) sin la necesidad de implementar hágalo usted mismo.Si tiene alguna duda sobre cómo proceder, herede y en una etapa posterior siempre podrá cambiar la implementación interna o desconectarse de vector3.

Además, no use nada menos preciso que el flotador: todos los procesadores en estos días funcionan lo suficientemente rápido como para ser más precisos que los enteros (a menos que esté destinado a dispositivos móviles, pero incluso allí ...) usando menos que el flotador, perdería precisión muy rápido y Termine con rotaciones y traducciones nerviosas, especialmente si planea usar más de una sola multiplicación de matriz/cuaternión.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top