الشبكة العربية لمطوري الألعاب

خبير مدير وسام البهنسي مشاركة 11

وفي 26/جمادى الأولى/1433 01:40 م، أعرب عبد اللطيف حاجي علي عن رأيه بالموقف كالآتي:

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

الأمر ليس بهذا السوء. أولاً الرباعيات يمكن تحويلها لمثلثات بسهولة. فقط أوصل رأسين متقابلين في الرباعي لينتج لديك مثلثان (سواء كان الرباعي محدباً أو مقعراً). الآن تصبح العملية عملية قص مثلث على مستطيل ذو أضلاع قائمة وموازية للمحاور، وهي الخوارزمية التي تقوم بها كافة معالجات الرسوميات لقص الجزء الظاهر من المثلثات على الشاشة. الخوارزمية القياسية المستخدمة في هذه الحالة هي خوارزمية ساذرلاند-هودجمان، وهي قادرة على التعامل مع المضلعات المحدبة على العموم، وليس فقط المثلثات، لكنها خوارزمية سهلة ومباشرة. هذا رابط يحوي كود محسن للخوارزمية في حالة المثلثات حصراً. الفصل الثاني يحوي كود جاهز للاستخدام في مظلل:
 
http://graphics.cs.williams.edu/papers/ClipJGT11/McGuire-Clipping.pdf
 
نفذ الإجراء أربعة مرات على كل مثلث لتحصل على الرباعي المتبقي داخل الخلية، ثم أكمل حسابات المساحة التي تريد...
 
تستطيع تنفيذ هذه الحسابات باستخدام مكتبة كودا CUDA أو سي بلس بلس آمب C++ AMP أو حتى المظللات البحتة للحصول على أداء صاروخي في حساب الآلاف من الرباعيات في زمن قليل جداً باستخدام معالج الرسوميات.
 
مثل هذه الحسابات -وفقاً لخبرتي الشخصية- قد تستغرق حوالي 5 ميللي ثانية لحساب 400 ألف رباعي على معالج رسوميات حديث. هل هذا كافي؟

وسام البهنسي
مبرمج في إنفيديا وإنفريمز

محترف مشرف عبد اللطيف حاجي علي مشاركة 12

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

شكراً.

عبد اللطيف حاجي علي
مبرمج
In|Framez