سؤال

أقوم حاليًا بتصميم برنامج يتضمن بعض الفيزياء (لا شيء خيالي، بضع كرات تصطدم ببعضها البعض)

ما هو نوع البيانات الأكثر دقة الذي يمكنني استخدامه لتمثيل الموضع (دون الشعور بالقفزات المنفصلة) في c#؟

أيضًا، ما هو أصغر مقدار من الوقت يمكنني الحصول عليه بين t وt+1؟علامة واحدة؟

يحرر:توضيح:ما هي أصغر وحدة زمنية في لغة C#؟ [TimeSpan].Tick?

هل كانت مفيدة؟

المحلول

في .نت أ decimal سيكون نوع البيانات الأكثر دقة الذي يمكنك استخدامه للموضع.أود فقط أن أكتب فصلًا دراسيًا لهذا المنصب:

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

أما بالنسبة للوقت، فلا يمكن لمعالجك أن يمنحك أي شيء أقل من علامة واحدة.

يبدو وكأنه مشروع ممتع!حظ سعيد!

نصائح أخرى

قد لا يكون نوع البيانات العشرية على الرغم من دقته هو الخيار الأمثل اعتمادًا على ما تريد القيام به.بشكل عام، يستخدم Direct3D ووحدات معالجة الرسومات عوامات 32 بت ومتجهات 3 (إجمالي 96 بت) لتمثيل موضع في x,y,z.

سيعطي هذا عادةً دقة أكثر من كافية إلا إذا كنت بحاجة إلى مزج كل من المستوى الضخم (الكواكب) والمستوى المجهري (كرات السلة) في نفس "العالم".

يمكن أن تكون أسباب عدم استخدام الكسور العشرية هي الحجم (4 × أكبر)، والسرعة (أوامر الحجم أبطأ) وعدم توفر وظائف مثلثية (AFAIK).

على نظام التشغيل Windows، الاستعلام عن أداء العداد ستمنحك وظيفة API أعلى دقة للساعة، و تردد أداء الاستعلام تردد العداد.أعتقد أن ساعة الإيقاف الموضحة في التعليقات الأخرى تلخص هذا في فئة .net.

ما لم تكن مهتمًا بعلم الصواريخ، فإن العلامة العشرية تعتبر مبالغة.وعلى الرغم من أنه قد يمنحك مواقع أكثر دقة، إلا أنه لن يمنحك بالضرورة سرعات أكثر دقة (على سبيل المثال)، نظرًا لأنه نوع بيانات ذو نقطة ثابتة وبالتالي يقتصر على نطاق أصغر بكثير من النطاق العائم أو المزدوج.

استخدم العوامات، لكن اترك الباب مفتوحًا للانتقال إلى المستوى المزدوج في حالة ظهور مشكلة في الدقة.

سأستخدم نوع بيانات Vector.تمامًا كما هو الحال في الفيزياء، عندما تريد تصميم حركة كائن، فإنك تستخدم المتجهات.إستخدم ناقل2 أو فئة Vector3 من XNA الإطار أو لفة الخاص بك هيكل Vector3 الخاص لتمثيل الموقف.Vector2 مخصص للثنائي الأبعاد و Vector3 ثلاثي الأبعاد.

الفترة الزمنية البنية أو ساعة التوقيف سيكون الفصل الدراسي هو أفضل خياراتك لحساب التغيير في الوقت المناسب.إذا كان علي أن أوصي، سأستخدم ساعة الإيقاف.

أعتقد أنك يجب أن تكون قادرًا على التخلص من نوع البيانات العشري دون أي مشكلة.لديها أكبر قدر من الدقة المتاحة.ومع ذلك، يجب أن يكون نوع البيانات المزدوج جيدًا.

نعم، العلامة هي أصغر علامة أعرفها (باستخدام فئة System.Diagnostics.Stopwatch).

لست متأكدًا من أنني فهمت سؤالك الأخير، هل يمكنك التوضيح؟

يحرر:

ربما ما زلت لا أفهم، ولكن يمكنك استخدام أي نوع تريده (على سبيل المثال، الزوجي) لتمثيل الوقت (إذا كان ما تريده بالفعل هو تمثيل تقدير الوقت لمشكلتك الفيزيائية، وفي هذه الحالة تكون علامة التجزئة غير ذات صلة).بالنسبة لمعظم المسائل الفيزيائية، ستكون المضاعفة كافية.

العلامة هي أفضل دقة يمكنك تحقيقها عند قياس الوقت باستخدام جهازك.

بالنسبة للمحاكاة، ربما يكون من الأفضل لك استخدام رقم عشري/مزدوج (نفس نوع الموضع) لوقت بلا أبعاد، ثم تحويله من/إلى شيء ذي معنى عند الإدخال/الإخراج.وإلا فسوف تقوم بعدد كبير من عمليات الإلقاء عندما تقوم بتحريك الأشياء.ستحصل على دقة عشوائية بهذه الطريقة أيضًا، لأنه يمكنك اختيار النطاق الزمني ليكون كبيرًا/صغيرًا كما تريد.

مرحبًا جوان، أنصحك باستخدام فئة Vector3 كما اقترحها العديد من الآخرين نظرًا لأنها سهلة الاستخدام وقبل كل شيء - تدعم جميع العمليات التي تحتاجها (مثل الجمع والضرب وضرب المصفوفات وما إلى ذلك...) دون الحاجة إلى التنفيذ بنفسك.إذا كان لديك أي شك حول كيفية المتابعة - ورثه وفي مرحلة لاحقة يمكنك دائمًا تغيير التنفيذ الداخلي، أو قطع الاتصال بـ Vector3.

أيضا ، لا تستخدم أي شيء أقل دقة من float - تعمل جميع المعالجات هذه الأيام بسرعة كافية لتكون أكثر دقة من الأعداد الصحيحة (ما لم تكن مخصصة للجوال ، ولكن حتى هناك ...) باستخدام أقل من تعويم ، ستفقد الدقة بسرعة كبيرة وينتهي بك الأمر بتناوب وترجمات سريعة ، خاصة إذا كنت تخطط لاستخدام أكثر من مصفوفة واحدة / ضرب رباعي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top