تعد خوارزمية المسافة 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
توضيح
روابط خارجية
- "إجراء سريع لحساب المسافة بين الكائنات المعقدة في الفضاء ثلاثي الأبعاد" ، جيلبرت ، جونسون وكيرثي - المنشور الأولي
- "حساب المسافة بين الكائنات" ، تنفيذ أستاذ أكسفورد ستيفن كاميرون ل GJK
- محاضرة فيديو مدتها 52 دقيقة عن تنفيذ جيلبرت جونسون كيرثي