Vra

Ek is tans die ontwerp van'n program wat sal behels'n fisika (niks te fancy, 'n paar balle gekraak aan mekaar)

Wat is die mees presiese datatype ek kan gebruik om te verteenwoordig posisie (sonder'n gevoel van diskrete spring) in c#?

Ook, wat is die kleinste bedrag van die tyd wat ek kan kry tussen t en t+1?Een merk?

EDIT:Verduidelik:Wat is die kleinste eenheid van tyd in C#? [TimeSpan].Tick?

Was dit nuttig?

Oplossing

In Net 'n decimal sal die mees akkurate data type wat jy kan gebruik vir posisie wees. Ek wil net skryf 'n klas vir die posisie:

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

As vir tyd, jou verwerker kan nie gee jou iets kleiner as een blok.

Dit klink na 'n prettige projek! Sterkte!

Ander wenke

Die desimale data tipe hoewel presiese dalk nie die optimale keuse wees afhangende van wat jy wil doen. Oor die algemeen Direct3D en GPU's gebruik 32-bis dryf, en draers van 3 (totale 96 stukkies) tot 'n posisie in x, y, z verteenwoordig.

Dit sal gewoonlik gee meer as genoeg presisie tensy jy nodig het om beide groot skaal (planete) en mikroskopiese vlak (basketballen) meng in dieselfde "wêreld".

Redes vir nie met behulp van Desimale kon grootte (4 x groter), spoed (ordes stadiger) en geen trigonometriese funksies beskikbaar (AFAIK).

Op Windows, die QueryPerformanceCounter API funksie sal jy die hoogste resolusie klok gee, en QueryPerformanceFrequency die frekwensie van die toonbank. Ek glo die ander kommentaar beskryf Stopwatch vou dit in 'n NET klas.

As jy doen vuurpyl wetenskap, 'n desimale is WAAAY overkill. En hoewel dit jou meer akkurate posisies kan gee, sal dit nie noodwendig gee jou meer akkurate (bv) snelhede, want dit is 'n vaste punt data type en daarom is beperk tot 'n veel kleiner omvang as 'n float of dubbel.

Gebruik dryf, maar laat die deur oop om te beweeg na dubbelspel in geval presisie blyk 'n probleem te wees nie.

Ek sou 'n Vector data type gebruik. Net soos in fisika, wanneer jy 'n voorwerpe beweging modelleer, gebruik jy vektore. Gebruik 'n Vector2 of Vector3 klas uit die XNA raamwerk of rol jou eie Vector3 struct om die posisie verteenwoordig. Vector2 is vir 2D en Vector3 is 3D.

panne struct of die Stophorlosie klas sal wees jou beste opsies vir die berekening van verandering in die tyd. As ek moes raai, sou ek Stopwatch gebruik.

Ek dink jy moet in staat wees om weg te kom met die desimale tipe data met geen probleem. Dit het die mees akkurate beskikbaar. Daar moet egter die dubbele data tipe net mooi wees.

Ja, 'n regmerkie is die kleinste Ek is bewus van (met behulp van die System.Diagnostics.Stopwatch klas).

Ek is nie seker ek verstaan nie jou laaste vraag, kan jy asseblief verduidelik?

Edit:

Ek kan nog steeds nie verstaan nie, maar jy kan gebruik om enige vorm wat jy wil (byvoorbeeld, dubbelspel) te verteenwoordig tyd (as dit wat jy eintlik wil doen is om verteenwoordig die discretization van die tyd vir jou fisika probleem, in welke geval die merk is irrelevant).Vir die meeste fisika probleme, verdubbel sou voldoende wees.

Die merk is die beste presisie jy kan bereik wanneer die meet van die tyd met jou masjien.

Vir 'n simulasie is jy waarskynlik beter daaraan toe met behulp van 'n desimale / dubbel (dieselfde tipe as posisie) vir 'n dimensielose tyd, dan die omskakeling dit vanaf / na iets sinvol oor toevoer / afvoer. Anders sal jy optree 'n ton van cast bedrywighede wanneer jy dinge rond te beweeg. Jy sal arbitrêr presisie kry op hierdie manier ook omdat jy die tydskaal kan kies as groot / klein as jy wil wees.

Hey Juan, ek wil aanbeveel dat jy die Vector3 klas gebruik soos voorgestel deur verskeie ander, want dit is maklik om te gebruik en bo alles - ondersteun alle bedrywighede wat jy nodig het (soos optel, vermenigvuldig, matriks vermeerder ens ...) sonder die nodig om dit self te implementeer. Indien u enige twyfel oor hoe om voort te gaan -. Beërwe dit en by 'n latere stadium kan jy altyd verander die innerlike implementering, of ontkoppel van vector3

Ook, gebruik nie enigiets minder akkuraat as float - al verwerkers deesdae loop vinnig genoeg meer akkuraat as heelgetalle te wees (tensy dit is bedoel vir mobiele, maar selfs daar ...) Die gebruik van minder as dryf jy sou verloor presisie baie vinnig en eindig met spring rotasies en vertalings, veral as jy van plan is om meer te gebruik as 'n enkele oorsig / viertal vermenigvuldiging.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top