سؤال

دعونا نقول لدي نقطتين في الفضاء 3D (أ و ب) و محور ثابت/وحدة ناقلات يسمى n.

أريد إنشاء دوران مصفوفة أن يقلل من euclidan المسافة بين النقطة a (لم تتم استدارته) و استدارة النقطة باء.

E. g:

 Q := matrix_from_axis_and_angle (n, alpha);

 find the unknown alpha that minimizes sqrt(|a - b*Q|)

راجع للشغل - إذا حل/خوارزمية يمكن أن يكون أسهل أعرب مع وحدة quaternions والمضي قدما في استخدام لهم.أنا فقط استخدام المصفوفات صياغة سؤالي لأنهم أكثر على نطاق واسع.


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

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

المحلول

ويبدو من السهل إلى حد ما. نفترض متجه وحدة ن يعني الدوران حول خط مواز لن خلال X0 نقطة. إذا X0! = الأصل، ترجمة نظام الإحداثيات التي كتبها -x0 للحصول على نقاط a' وb' مقارنة جديدة تنسيق أصل النظام 0، واستخدام تلك النقاط 2 بدلا من أ و ب.

1) حساب ناقلات راي = ن س ل

2) وحدة حساب ناقلات UY = وحدة متجه في اتجاه وراي

و3) حساب وحدة مكافحة ناقلات UX = UY س ن

لديك الآن الثلاثي ناقلات حدة المتعامدة UX، أوي، ون، والتي تشكل نظام اليد اليمنى تنسيق. ويمكن أن تظهر ما يلي:

 a = dot(a,n) * n  +  dot(a,ux) * ux

وذلك لأن وحدة مكافحة ناقلات UY موازية للراي الذي هو عمودي على حد سواء ون. (من الخطوة 1)

و4) حساب مكونات ب طول متجهات الوحدة UX، UY. وفي المكونات (الفأس، 0) حيث الفأس = نقطة (أ، UX). مكونات ب هي (BX، من قبل) حيث ب س = نقطة (ب، UX)، التي كتبها = نقطة (ب، UY). بسبب نظام يمنى تنسيق والفأس إيجابية دائما حتى انك لا تحتاج بالفعل لحساب ذلك.

و5) حساب ثيتا = ATAN2 (من قبل، ب س).

وتناوب مصفوفة الخاص بك هو واحد والتي تدور من زاوية -theta النسبي إلى نظام الإحداثيات (UX، أوي، ن) حول المحور ن.

وهذا ينتج إجابات منحطة إذا كان هو مواز لن (الخطوات 1 و 2)، أو إذا ب موازية إلى n (الخطوات 4 و 5).

نصائح أخرى

أعتقد أنك يمكن أن أعيد صياغة السؤال إلى:

ما هي المسافة من نقطة إلى 2d دائرة في الفضاء 3d.

يمكن العثور على الجواب هنا

وبالتالي فإن الخطوات المطلوبة هي على النحو التالي:

  • تناوب نقطة ب حول ناقلات n يعطيك 2d دائرة في الفضاء 3d
  • باستخدام أعلاه ، إيجاد المسافة إلى هذه الدائرة (و نقطة على الدائرة)
  • نقطة على الدائرة هو استدارة النقطة b كنت تبحث عن.
  • نستنتج استدارة زاوية

...أو شيء؛^)

وسوف يكون الحد الأدنى المسافة عندما متجه من على خط طول خطوط ن مع متجه من ب إلى خط طول ن.

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

واسمحوا P تكون الطائرة التي هو عمودي على ن. يمكننا العثور على إسقاط لفي P-الطائرة، (وعلى نحو مماثل لب):

a' = a - (dot(a,n)) n 
b' = b - (dot(b,n)) n 

وحيث النقطة (أ، ن) هي دوت نتاج و n

وعلى "وب" الكذب في P-الطائرة.

لقد خفضت الآن المشكلة إلى 2 الأبعاد. ياي!

وزاوية (الدوران) بين 'ب' تساوي زاوية (الدوران) اللازمة للتأرجح ب حول محور ن بحيث تكون أقرب إلى. (فكر الظلال سيكون ب يلقي على P-الطائرة).

والزاوية بين 'ب' من السهل العثور على:

dot(a',b') = |a'| * |b'| * cos(theta)

وحل لثيتا.

والآن يمكنك العثور على مصفوفة دوران نظرا ثيتا و n هنا: http://en.wikipedia.org/wiki/Rotation_matrix

وجيسون S يشير بحق إلى أن بمجرد أن تعرف ثيتا، يجب أن تزال تقرر تدوير ب عقارب الساعة أو عكس اتجاه عقارب الساعة حول محور ن.

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

إذا (أ س ب) تكمن في نفس اتجاه ن، ثم ب يجب أن تكون استدارة في اتجاه عقارب الساعة من قبل ثيتا زاوية حول محور ن.

إذا (أ س ب) تكمن في الاتجاه المعاكس، ثم ب يجب أن تكون استدارة في اتجاه عقارب الساعة من زاوية -theta حول محور ن.

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