الرئيسيةعريقبحث

خوارزمية كشف التصادم


☰ جدول المحتويات


تعد خوارزمية المسافة Gilbert-Johnson-Keerthi طريقة لتحديد الحد الأدنى للمسافة بين مجموعتين محدبتين . على عكس العديد من خوارزميات المسافة الأخرى ، فإنه لا يتطلب تخزين بيانات الهندسة في أي تنسيق محدد ، ولكن بدلاً من ذلك يعتمد فقط على وظيفة دعم لإنشاء تكرارات بسيطة أقرب إلى الإجابة الصحيحة باستخدام مجموع Minkowski (CSO) لشكلين محدبين.

تستخدم خوارزميات "GJK المحسّنة" معلومات الحافة لتسريع الخوارزمية باتباع الحواف عند البحث عن البساط التالي. هذا يحسن الأداء إلى حد كبير لل polytopes مع أعداد كبيرة من الرؤوس.

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

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

نظرة عامة

يعتمد GJK على وظيفتين:

  • خطأ رياضيات (خطأ في الصياغة): {\displaystyle <mrow class="MJX-TeXAtom-ORD"><mstyle displaystyle="true" scriptlevel="0"><mrow class="MJX-TeXAtom-ORD"><mi mathvariant="normal"> <math>\mathrm{Support}(\mathrm{shape}, \vec{d})} </mi><mi mathvariant="normal"> </mi><mi mathvariant="normal"> </mi><mi mathvariant="normal"> </mi><mi mathvariant="normal"> </mi><mi mathvariant="normal"> </mi><mi mathvariant="normal"> </mi></mrow><mo stretchy="false"> </mo><mrow class="MJX-TeXAtom-ORD"><mi mathvariant="normal"> </mi><mi mathvariant="normal"> </mi><mi mathvariant="normal"> </mi><mi mathvariant="normal"> </mi><mi mathvariant="normal"> </mi></mrow><mo> </mo><mrow class="MJX-TeXAtom-ORD"><mrow class="MJX-TeXAtom-ORD"><mover><mi> </mi><mo stretchy="false"> </mo></mover></mrow></mrow><mo stretchy="false"> </mo></mstyle></mrow> </math> </img> ، والتي ترجع النقطة على shape والتي لديها أعلى نقطة المنتج مع خطأ رياضيات (خطأ في الصياغة): {\displaystyle <mrow class="MJX-TeXAtom-ORD"><mstyle displaystyle="true" scriptlevel="0"><mrow class="MJX-TeXAtom-ORD"><mrow class="MJX-TeXAtom-ORD"><mover><mi> <math>\vec{d}} </mi><mo stretchy="false"> </mo></mover></mrow></mrow></mstyle></mrow> </math> </img> .
  • خطأ رياضيات (خطأ في الصياغة): {\displaystyle <mrow class="MJX-TeXAtom-ORD"><mstyle displaystyle="true" scriptlevel="0"><mrow class="MJX-TeXAtom-ORD"><mi mathvariant="normal"> <math>\mathrm{NearestSimplex}(s)} </mi><mi mathvariant="normal"> </mi><mi mathvariant="normal"> </mi><mi mathvariant="normal"> </mi><mi mathvariant="normal"> </mi><mi mathvariant="normal"> </mi><mi mathvariant="normal"> </mi><mi mathvariant="normal"> </mi><mi mathvariant="normal"> </mi><mi mathvariant="normal"> </mi><mi mathvariant="normal"> </mi><mi mathvariant="normal"> </mi><mi mathvariant="normal"> </mi><mi mathvariant="normal"> </mi></mrow><mo stretchy="false"> </mo><mi> </mi><mo stretchy="false"> </mo></mstyle></mrow> </math> </img> ، والتي تأخذ simplex s وتُرجع simplex على s الأقرب إلى الأصل ، واتجاهًا نحو الأصل طبيعيًا إلى simplex الجديد. إذا كانت s نفسها تحتوي على الأصل ، فإن NearestSimplex يقبل s ويتم تحديد الشكلين على التقاطع.

قد تكون NearestSimplex التي تتم معالجتها بواسطة NearestSimplex أي مساحة فرعية بسيطة لـ Rn . على سبيل المثال ، في ثلاثي الأبعاد ، قد تكون نقطة أو مقطع خط أو مثلث أو رباعي السطوح ؛ يتم تحديد كل نقطة بمقدار 1 أو 2 أو 3 أو 4 نقاط على التوالي.

شبة الكود

function GJK_intersection(shape p, shape q, vector initial_axis): vector A = Support(p, initial_axis) - Support(q, -initial_axis) simplex s = {A} vector D = -A loop: A = Support(p, D) - Support(q, -D) if dot(A, D) < 0: reject s = s ∪ A s, D, contains_origin = NearestSimplex(s) if contains_origin: accept

توضيح

نوعان من الاصطدام ووجه CSO المقابل: قمة الرأس (أعلى) وحافة الحافة (أسفل).

روابط خارجية

موسوعات ذات صلة :