Domanda

Attualmente sto progettando un programma che coinvolgerà un po' di fisica (niente di stravagante, alcune palline che si schiantano l'una contro l'altra)

Qual è il tipo di dati più esatto che posso usare per rappresentare la posizione (senza la sensazione di salti discreti) in C#?

Inoltre, qual è il tempo minimo che posso ottenere tra t e t+1?Un segno di spunta?

MODIFICARE:Chiarimento:Qual è la più piccola unità di tempo in C#? [TimeSpan].Tick?

È stato utile?

Soluzione

In .Net a decimal sarà il tipo di dati più preciso che potresti utilizzare per la posizione.Vorrei semplicemente scrivere un corso per la posizione:

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

Per quanto riguarda il tempo, il tuo processore non può darti nulla di meno di un tick.

Sembra un progetto divertente!Buona fortuna!

Altri suggerimenti

Il tipo di dati Decimal, sebbene preciso, potrebbe non essere la scelta ottimale a seconda di ciò che vuoi fare.Generalmente Direct3D e le GPU utilizzano numeri in virgola mobile a 32 bit e vettori di 3 (totale 96 bit) per rappresentare una posizione in x,y,z.

Questo di solito darà una precisione più che sufficiente a meno che non sia necessario mescolare sia la scala enorme (pianeti) che quella microscopica (palle da basket) nello stesso "mondo".

I motivi per non utilizzare i decimali potrebbero essere le dimensioni (4 volte più grandi), la velocità (ordini di grandezza più lenti) e l'assenza di funzioni trigonometriche disponibili (AFAIK).

Su Windows, il QueryPerformanceCounter La funzione API ti fornirà l'orologio con la risoluzione più alta e QueryPerformanceFrequency la frequenza del contatore.Credo che il cronometro descritto in altri commenti lo racchiuda in una classe .net.

A meno che tu non stia facendo scienza missilistica, un decimale è WAAAY eccessivo.E anche se potrebbe darti posizioni più precise, non necessariamente ti darà velocità più precise (ad esempio), poiché è un tipo di dati a virgola fissa e quindi è limitato a un intervallo molto più piccolo di un float o double.

Usa i float, ma lascia la porta aperta per muoverti fino al raddoppio nel caso in cui la precisione risulti essere un problema.

Vorrei utilizzare un tipo di dati Vector.Proprio come in Fisica, quando vuoi modellare il movimento di un oggetto, usi i vettori.Usare un Vettore2 O Classe Vector3 da XNA quadro o arrotolare il tuo propria struttura Vector3 per rappresentare la posizione.Vector2 è per 2D e Vector3 è 3D.

Arco di tempo struct o il Cronometro la classe sarà la tua migliore opzione per calcolare il cambiamento nel tempo.Se dovessi consigliarlo, utilizzerei Cronometro.

Penso che dovresti riuscire a farla franca con il tipo di dati Decimal senza problemi.Ha la massima precisione disponibile.Tuttavia, il tipo di dati double dovrebbe andare bene.

Sì, un segno di spunta è il più piccolo di cui sono a conoscenza (utilizzando la classe System.Diagnostics.Stopwatch).

Non sono sicuro di aver capito la tua ultima domanda, potresti chiarirmi?

Modificare:

Potrei ancora non capire, ma puoi usare qualsiasi tipo tu voglia (ad esempio, double) per rappresentare il tempo (se quello che vuoi effettivamente è rappresentare la discretizzazione del tempo per il tuo problema di fisica, nel qual caso il segno di spunta è irrilevante).Per la maggior parte dei problemi di fisica, il doppio sarebbe sufficiente.

Il segno di spunta rappresenta la massima precisione che puoi ottenere quando misuri il tempo con la tua macchina.

Per una simulazione probabilmente è meglio usare un decimale/doppio (stesso tipo della posizione) per un tempo adimensionale, quindi convertirlo da/a qualcosa di significativo su input/output.Altrimenti eseguirai un sacco di operazioni di cast quando sposti le cose.In questo modo otterrai anche una precisione arbitraria, perché puoi scegliere che la scala temporale sia grande/piccola quanto desideri.

Ehi Juan, ti consiglio di utilizzare la classe Vector3 come suggerito da molti altri poiché è facile da usare e soprattutto supporta tutte le operazioni di cui hai bisogno (come addizione, moltiplicazione, moltiplicazione di matrici ecc...) senza la necessità di implementare fai da te.Se hai qualche dubbio su come procedere, ereditalo e in una fase successiva puoi sempre modificare l'implementazione interna o disconnetterti da vector3.

Inoltre, non usare nulla di meno preciso del galleggiante: tutti i processori in questi giorni sono abbastanza veloci da essere più accurati degli interi (a meno che non sia pensato per il cellulare, ma anche lì ...) Usando meno che il galleggiante perderesti la precisione molto velocemente e Finisci con rotazioni e traduzioni salti, soprattutto se si prevede di utilizzare più di una singola moltiplicazione a matrice/quaternione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top