سؤال

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

لذلك لديك هذه المتغيرات ...

Point3F spherePnt;
F32 sphereRadius;
Point3F testPnt;

بإمكاني عمل...

F32 dist = ( spherePnt - testPnt ).len() - sphereRadius;

إذا كان Dist موجبًا ، فسيكون خارج نصف القطر ، إذا كان Dist سالبًا ، فسيكون داخل نصف القطر.

أو كتحسين لتجنب الجذر المربع داخل وظيفة LEN () ، يمكنك تجربة ذلك ...

F32 dist = ( spherePnt - testPnt ).lenSquared() - ( sphereRadius * sphereRadius );

حسنًا ، هذا يبدو أنه يصنع منذ النظرة الأولى ، ولكن يبدو أنه يمنحني بالفعل نتائج غير صحيحة.

على سبيل المثال ، يتم إعداد المتغيرات المعينة مثل هذا ...

SpherePnt( 0, 0, 0 )
SphereRadius( 1 )
testPnt( 1, 1, 1 )

خذ نتيجة ...

F32 dist = ( spherePnt - testPnt ).len() - sphereRadius;
F32 dist2 = mSqrt( ( spherePnt - testPnt ).lenSquared() - ( sphereRadius * sphereRadius ) );

dist = 0.7320508075688772935274463415059;
dist2 = 0.4142135623730950488016887242097;

من الواضح أن هذا في الواقع ، خطأ ، رياضيا. إنه يقلل من توقع أن يكون الجذر التربيعي لـ 2 هو نفسه الجذر التربيعي لـ 3 ... لذا فإن السؤال هو ، على ما أعتقد ...

بالنظر إلى أنني أرغب في إجراء هذا الاختبار ، "هل النقطة P ضمن نطاق R من كرة" ، هل هناك طريقة للقيام بذلك مع تجنب الجذر التربيعي؟

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

المحلول

لا تحتاج إلى حساب SQRT في نهج "المسافات التربيعية"! المسافة بين النقطتين (مركز الكرة ونقطة اختبار) أقل من نصف قطرها IFF ، تكون المسافة المربعة أقل من نصف القطر التربيعي - لغرض وحيد هو اختبار "داخل الكرة أو الخروج منه؟" ، حقيقة أن ذلك الجذر التربيعي للفرق ليس هو الفرق في الجذور المربعة ، غير ذي صلة تمامًا.

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