سؤال

وأنا بحاجة إلى حل شيء بسيط نسبيا - لقد حصلت ن القمم محدب 2D المضلع والأفقي خط مع بعض 'ذ' تنسيق (!). أحتاج شيئا واحدا فقط: للتحقق مما إذا عبرت المضلع مع هذا الخط (أي يكون 2 التقاطعات) أو لا

وأسرع واحد أستطيع أن أفكر في أن يجد دقيقة / إحداثيات ص كحد أقصى داخل مضلع (حلقة تكرار ن مرات مع اثنين من يقارن ومتجرين) ومن ثم مقارنة إذا ذ دقيقة <= ذ <ماكس ذ.

وبطريقة ما أشعر بأن هذا يمكن حلها أكثر "رياضيا" ولكن أنا دائما في نهاية مع رمز أبطأ (على سبيل المثال طريقة ناقلات - أحتاج لحساب الفروق لن [i] و ن [ط + 1]، ثم ضرب لهم، إضافة الخ - أبطأ بكثير ثم 2 CMPS + مخازن)

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

المحلول

وتحتاج فقط لمعرفة ما اذا كان المضلع لديه نقطة مع Y1 <ذ واحد مع Y2> ذ. في أقرب وقت كنت قد وجدت هذه نقطتين، وأنت القيام به. إذا كنت تستطيع المؤشر الخاص بك عن طريق الإحداثي ص، التي يجب أن تكون على بحث سريع.

نصائح أخرى

واذا كان خط أفقي 2D ثم نعم، والطريقة التي وصفته هو على الارجح أسرع. هل يمكن أن ماس كهربائى أنها كذلك، كما لو تحصل بشكل جزئي خلال الاختيار ولها دقيقة + ماكس التي هي> و <قيمة ذ الخاص بك، ثم لديك التقاطع.

إذا كان لديك للقيام بذلك على الخام في كل مرة، ثم ربما كنت لن تجد أي خدعة لجعلها أسرع من ذلك.

إذا يمكنك ذاكرة التخزين المؤقت دقيقة / قيمة الحد الأقصى Y مع المضلع، ثم يمكنك توفير الوقت من خلال عدم التكرار كل قمة في كل مرة تفعل الاختبار.

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

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

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