2008-08-26 3 views
9

Я в настоящее время разрабатывает программу, которая будет включать некоторые физики (ничего слишком фантазии, несколько шариков разбивая друг к другу)Datatypes для физики

Какой самый точный тип данных можно использовать для представления позиции (без чувства дискретных прыжков) в C#?

Кроме того, какое наименьшее количество времени я могу получить между t и t + 1? Один тик?

EDIT: Разъяснение: Какая самая маленькая единица времени в C#? [TimeSpan].Tick?

ответ

8

В .Net a decimal будет самым точным типом данных, который вы могли бы использовать для позиции. Я бы просто написать класс для позиции:

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

Что касается времени, ваш процессор не может дать вам что-либо меньшее, чем один тик.

Звучит весело! Удачи!

+1

-1: Децималы редко используются в любых вычислениях в 3D-игре, они слишком медленны. Используйте класс Vector, построенный с 3 поплавками, и вы все настроены. – 2009-02-24 18:29:19

+1

+1: Для реальных типов десятичное значение является самым точным, и это то, что было задано. – Rusty 2010-05-20 21:24:20

0

Я не уверен, что я понимаю ваш последний вопрос, не могли бы вы прояснить?

Edit:

Я мог бы до сих пор не понимаю, но вы можете использовать любой тип вы хотите (например, в два раза), чтобы представлять время (если то, что вы на самом деле хотите, чтобы представлять дискретность времени для вашей проблемы физики , и в этом случае галочка не имеет значения). Для большинства проблем физики достаточно удвоения.

Тик - это лучшая точность, которую вы можете достичь при измерении времени с помощью вашей машины.

0

Я думаю, что вам не придется беспокоиться о типе данных Decimal. Он имеет самую высокую точность. Тем не менее, двойной тип данных должен быть прекрасным.

Да, тик - это самое маленькое, что я знаю (используя класс System.Diagnostics.Stopwatch).

0

Для моделирования вам, вероятно, лучше использовать десятичный/двойной (такой же тип, что и позиция) для безразмерного времени, а затем преобразовать его из/в нечто значимое на входе/выходе. В противном случае вы будете выполнять тонну операций, когда вы перемещаете вещи. Таким образом, вы получите произвольную точность, потому что вы можете выбрать шкалу времени как можно большего/малого размера.

9

Тип десятичных данных, хотя и точный, возможно, не оптимальный выбор в зависимости от того, что вы хотите сделать. Обычно Direct3D и GPU используют 32-битные поплавки и векторы 3 (всего 96 бит) для представления позиции по x, y, z.

Это, как правило, дает более чем достаточную точность, если вам не нужно смешивать как огромный масштаб (планеты), так и микроскопический уровень (баскетбол) в одном и том же «мире».

Причины отказа от использования Decimals могут быть размером (4 x больше), скоростью (на порядок медленнее) и отсутствием тригонометрических функций (AFAIK).

В Windows функция QueryPerformanceCounter API предоставит вам часы с самым высоким разрешением и QueryPerformanceFrequency частота счетчика. Я считаю, что секундомер, описанный в других комментариях, обертывает это в классе .net.

3

Я бы использовал векторный тип данных.Как и в физике, когда вы хотите моделировать движение объектов, вы используете векторы. Используйте рамки Vector2 или Vector3 class out of the XNA или сверните свой own Vector3 struct, чтобы представить позицию. Vector2 для 2D, а Vector3 - 3D.

TimeSpan класс или Stopwatch класс будет вашим лучшим вариантом для расчета изменений во времени. Если бы мне пришлось рекомендовать, я бы использовал секундомер.

0

Привет, Хуан, я бы рекомендовал вам использовать класс Vector3, как было предложено несколькими другими, поскольку он прост в использовании и, прежде всего, поддерживает все необходимые операции (например, сложение, умножение, умножение матрицы и т. Д.) Без необходимость реализовать его самостоятельно. Если у вас есть какие-либо сомнения относительно того, как действовать - наследуйте его, и на более позднем этапе вы всегда можете изменить внутреннюю реализацию или отключиться от vector3.

Кроме того, не используйте ничего менее точного, чем float - все процессоры в эти дни работают достаточно быстро, чтобы быть более точными, чем целые (если это не предназначено для мобильных устройств, но даже там ...) Используя меньше, чем float, вы бы теряют точность очень быстро и заканчиваются скачкообразными вращениями и переводами, особенно если вы планируете использовать более одного умножения матрицы/кватерниона.

5

Если вы не занимаетесь ракетоведческой наукой, десятичной единицей является перегиб WAAAY. И хотя это может дать вам более точные позиции, это не обязательно даст вам более точные (например) скорости, поскольку это тип данных с фиксированной точкой и, следовательно, ограничен гораздо меньшим диапазоном, чем поплавок или двойной.

Используйте поплавки, но оставьте дверь открытой, чтобы перейти к удвоению, если точность окажется проблемой.

Смежные вопросы