سؤال

كنت في حاجة إلى القليل من مساعدة الرياضيات التي لا يمكنني العثور على الإجابة عليها ، فإن أي روابط إلى الوثائق ستكون موضع تقدير كبير.

هيريس وضعي ، ليس لدي أي فكرة عن المكان الذي أكون فيه في هذه المتاهة ، لكنني بحاجة إلى التحرك وأجد طريقي إلى البداية. كنت أفكر في تنفيذ قائمة نقاط الطريق للأماكن التي أقابلتها من بدايتي في 0،0. هذه طائرة ديكارتية ثنائية الأبعاد.

لقد حصلت على خصائصين ، وسرعة الترجمة الخاصة بي من 0-1 وسرعة الدوران الخاصة بي من -1 إلى 1. -1 تركت جدا و +1 صحيح جدا. هذه هي السرعة وليس الزوايا ، لذلك تكمن مشكلتي. إذا أعطيت 0 كسرعة ترجمة و 0.2 ، فسوف ألجأ باستمرار إلى يميني بسرعة بطيئة.

كيف يمكنني اكتشاف الإزاحة بالنظر إلى هذين المتغيرين؟ يمكنني تخزينها في كل مرة أتخذ فيها "خطوة".

أنا فقط بحاجة إلى اكتشاف الإزاحة في مصطلحات x و y بالنظر إلى الترجمات وسرعات الدوران. والدوران للوصول إلى تلك النقاط.

أي مساعدة موضع تقدير.

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

المحلول

سؤالك غير واضح في بضع نقاط ، لذلك يجب أن أقوم ببعض الافتراضات:

  1. خلال كل فترة زمنية ، تكون سرعة الترجمة وسرعة الدوران ثابتة.
  2. أنت تعرف قيم هذه المتغيرات في كل فترة زمنية (وأنت تعرف السرعة الدورانية في الوحدات القابلة للاستخدام ، مثل الراديان في الثانية ، وليس فقط "اليسار").
  3. أنت تعرف العنوان الأولي.
  4. يمكنك الحفاظ على دقة كافية من أن خطأ Roundoff ليس مشكلة.

بشرط، هناك حل دقيق. أولا الجزء السهل:

delta_angle = omega * delta_t

حيث أوميغا هي السرعة الزاوية. المسافة المقطوعة (ربما على طول المنحنى)

dist = speed * delta_t

ونصف قطر المنحنى

radius = dist / delta_angle

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

delta_x_0 = radius * sin(delta_angle)
delta_y_0 = radius * (1 - cos(delta_angle))

نظرًا لأننا نريد أن نكون قادرين على التعامل مع Delta_angle صغير جدًا ونصف قطر كبير جدًا ، فسنوسع الخطيئة والكوس ، ونستخدم هذا فقط عندما تكون السرعة الزاوية قريبة من الصفر:

dx0 = r * sin(da)     = (dist/da) * [ da - da^3/3! + da^5/5! - ...]
                     =  dist     * [  1 - da^2/3! + da^4/5! - ...]

dy0 = r * (1-cos(da)) = (dist/da) * [ da^2/2! - da^4/4! + da^6/6! - ...]
                     =  dist     * [   da/2! - da^3/4! + da^5/6! - ...]

لكن الزاوية عمومًا لا تساوي الصفر ، لذلك يتعين علينا تدوير هذه النزوح:

dx = cos(angle) * dx0 - sin(angle) * dy0
dy = sin(angle) * dx0 - cos(angle) * dy0

نصائح أخرى

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

angle = angle + omega * delta_t;

const double d_x = cos( angle );
const double d_y = sin( angle );

x = x + d_x * delta_t * v;
y = y + d_y * delta_t * v;

حيث تقوم بتخزين الحالية الخاصة بك angle خارج في كل خطوة. (( d_x, d_y ) هو ناقل الاتجاه الحالي و omega هي سرعة الدوران التي لديك. delta_t من الواضح أن Timestep الخاص بك و v هي سرعتك.

قد يكون هذا ساذجًا جدًا بحيث لا يمكن تقسيمه إلى مرحلتين متميزتين. لست متأكدًا من أنني لم أفكر حقًا في ذلك كثيرًا ولم أقم باختباره ، لكن إذا نجح ، فأخبرني بذلك!

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