تحسين مسافة النقاط لاختبار الكرة
-
21-09-2019 - |
سؤال
أود اختبار ما إذا كانت النقطة على مسافة معينة من الكرة.
لذلك لديك هذه المتغيرات ...
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 ، تكون المسافة المربعة أقل من نصف القطر التربيعي - لغرض وحيد هو اختبار "داخل الكرة أو الخروج منه؟" ، حقيقة أن ذلك الجذر التربيعي للفرق ليس هو الفرق في الجذور المربعة ، غير ذي صلة تمامًا.