Вопрос

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

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

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

РЕДАКТИРОВАТЬ:Уточнение:Какова наименьшая единица времени в C#? [TimeSpan].Tick?

Это было полезно?

Решение

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

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

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

Звучит как забавный проект!Удачи!

Другие советы

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

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

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

В Windows ЗапросPerformanceCounter Функция API предоставит вам часы с самым высоким разрешением и Частота выполнения запроса частота счетчика.Я считаю, что секундомер, описанный в других комментариях, помещает это в класс .net.

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

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

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

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

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

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

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

Редактировать:

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top