سؤال

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

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

المحلول

لا أعرف ما هي الطريقة القياسية للقيام بذلك، ولكن إذا كنت تريد فقط معرفة ما إذا كان يتقاطع، فإليك ما سأفعله.

قاعدة عامة ...تجنب إجراء sqrt() أو عمليات أخرى مكلفة.عندما يكون ذلك ممكنًا، تعامل مع مربع نصف القطر.

  1. تحديد ما إذا كانت نقطة البداية تقع داخل نصف قطر الكرة.إذا كنت تعلم أن هذا لن يحدث أبدًا، فتخط هذه الخطوة.إذا كنت في الداخل، فسوف يتقاطع شعاعك مع الكرة.

من الآن فصاعدا، نقطة البداية الخاصة بك هي خارج المجال.

  1. الآن، تخيل الصندوق الصغير الذي يناسب الكرة.إذا كنت خارج هذا المربع، فتحقق من اتجاه x واتجاه y واتجاه z للشعاع لمعرفة ما إذا كان سيتقاطع مع جانب المربع الذي يبدأ منه الشعاع.يجب أن يكون هذا فحصًا بسيطًا للعلامة، أو مقارنة بالصفر.إذا كنت خارجها وابتعدت عنها، فلن تتقاطع معها أبدًا.

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

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

دع شعاعك يمثله (x0 + iر، ذ0 + ير، ض0 + كt) ويكون مركز الكرة عند (xS, yS, zS).لذا، نريد إيجاد t بحيث يعطينا الأقصر من (xS - x0 - iر، يس - ذ0 - ير، ضS - ض0 - كر).

دع x = xS - x0، y = yX - y0، z = zS - z0، D = حجم المتجه تربيع

د = س^2 -2*سأناتي + (i*t)^2 + y^2 - 2*yيتي + (ي*تي)^2 + ض^2 - 2*ضكر + (ك*ر)^2

د = (ط ^ 2 + ي ^ 2 + ك ^ 2)ر ^ 2 - (سأنا + ذي + ضك)*2*ر + (س^2 + ص^2 + ض^2)

dD/dt = 0 = 2*t*(i^2 + j^2 + k^2) - 2*(xأنا + ذي + ض * ك)

ر = (سأنا + ذي + ض * ك) / (ط ^ 2 + ي ^ 2 + ك ^ 2)

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

نصائح أخرى

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

والنظر لديك متجه خط راي الخاص بك، A -> B

وأنت تعرف أن أقصر مسافة بين هذه النواقل ووسط ميدان يحدث عند تقاطع ناقلات راي ومتجه الذي هو في 90 درجة لهذا الذي يمر عبر وسط المجال.

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

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

ولك شيء على أن العمل الذي على أي حال الموقف إذا كنت تريد الدقة. والطريقة الوحيدة لتحسين سرعة حسابيا هو التحول من تقاطع أشعة المجال إلى مربع إحاطة راي التقاطع.

وأو هل يمكن أن تذهب أعمق ومحاولة لتحسين الجذر التربيعي وغيرها من المكالمات وظيفة الداخلية

http://wiki.cgsociety.org/index.php/Ray_Sphere_Intersection

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