raycasthit - type number c#
Tipos de datos para fĂsica (8)
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 una sensación de saltos discretos) en c #?
Además, ¿cuál es la cantidad de tiempo más pequeña que puedo obtener entre t y t + 1? Un tic?
EDITAR: Aclarando: ¿Cuál es la unidad de tiempo más pequeña en C #? [TimeSpan].Tick
¿ [TimeSpan].Tick
?
Hola, Juan, te recomendaría que uses la clase Vector3 como lo sugirieron 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 implementar usted mismo Si tiene alguna duda sobre cómo proceder, hágalo y más adelante 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í ...) Si utiliza menos que flotar, perderá precisión muy rápido y terminan con rotaciones y traducciones turbulentas, especialmente si planea usar más de una simple multiplicación de matriz / cuaternión.
Creo que debería poder salirse con la suya con 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).
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á una 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".
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 las funciones trigonométricas no 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.
En .Net, un decimal
será el tipo de datos más preciso que podría usar para la posición. Solo 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 más pequeño que un tic.
¡Suena como un proyecto divertido! ¡Buena suerte!
No estoy seguro de entender tu última pregunta, ¿podrías aclarar?
Editar:
Puede que todavía no entienda, pero puede usar cualquier tipo que desee (por ejemplo, dobles) para representar el tiempo (si lo que realmente quiere es representar la discretización del tiempo para su problema de física, en cuyo caso el tic no es relevante). Para la mayoría de los problemas de física, los dobles serían suficientes.
La marca es la mejor precisión que puede lograr al medir el tiempo con su máquina.
Para una simulación, probablemente sea mejor usar 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.
Yo usaría un tipo de datos Vector. Al igual que en Física, cuando quieres modelar un movimiento de objetos, usas vectores. Utilice una clase Vector2 o Vector3 del marco XNA o despliegue su propia estructura Vector3 para representar la posición. Vector2 es para 2D y Vector3 es 3D.
La estructura TimeSpan o la clase Cronómetro serán sus mejores opciones para calcular el cambio en el tiempo. Si tuviera que recomendarlo, usaría Cronómetro.
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 avanzar hasta el doble en caso de que la precisión resulte un problema.