كيف يمكنك حساب الزاوية المنعكسة بالنظر إلى متجهين في الفضاء ثلاثي الأبعاد؟

StackOverflow https://stackoverflow.com/questions/2454529

سؤال

أريد حساب الزاوية بين المتجهين a وb.لنفترض أن هذه هي في الأصل.يمكن القيام بذلك مع

theta = arccos(a . b / |a| * |b|)

لكن arccos يمنحك الزاوية في [0، pi]، أي.لن يمنحك أبدًا زاوية أكبر من 180 درجة، وهو ما أريده.إذًا كيف يمكنك معرفة متى تجاوزت المتجهات علامة 180 درجة؟في الوضع ثنائي الأبعاد، أود ببساطة أن أترك إشارة المكون y على أحد المتجهات تحدد الربع الذي يوجد فيه المتجه.ولكن ما هي أسهل طريقة للقيام بذلك في 3D؟

يحرر:أردت أن أبقي السؤال عامًا ولكن ها نحن ذا.أنا أبرمج هذا بلغة C والرمز الذي أستخدمه للحصول على الزاوية هو theta = acos(dot(a, b)/mag(a)*mag(b)) فكيف يمكنك تحديد الاتجاه برمجيا؟

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

المحلول 2

توصلت إلى الحل التالي الذي يستفيد من تغيير اتجاه حاصل الضرب المتقاطع للمتجهين:

  1. اصنع ناقل n = a X b وتطبيعها.هذا المتجه طبيعي بالنسبة للمستوى الممتد بواسطة a وb.

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

قد ترغب في أن يكون لديك عتبة للمسافة حيث أن المسافة بعد الانقلاب قد تكون أقل من 2، اعتمادًا على كيفية توجيه المتجهين a وb وعدد مرات تحديث الزاوية.

نصائح أخرى

وهذا يعمل في 2D لأنك طائرة المعرفة في التي تحدد التناوب.

إذا كنت تريد أن تفعل هذا في 3D، وليس هناك مثل هذه الضمنية طائرة 2D. هل يمكن تحويل الإحداثيات 3D لطائرة 2D التي يمر بها كل النقاط الثلاث، والقيام الحساب الخاص بك داخل هذه الطائرة.

ولكن، هناك بالطبع اثنين من التوجهات المحتملة للطائرة، والتي من شأنها أن تؤثر على أي زوايا ستكون> 180 أو أصغر.

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

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

وفقط للتأكد من أنك دائما حساب المعدلات بنفس ترتيب ناقلات.

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

وهناك حلول أكثر كفاءة possbly، ولكن هذا هو واحد خطرت لي.

وتحرير: توضيح ناقلات خلق a X b = p. هذا هو عمودي على حد سواء a وb. ثم قم بواحد: a X p أو b X p لخلق ناقلات أخرى وهذا هو الطبيعي أن الطائرة التي تم إنشاؤها بواسطة ناقلات 2. اختيار ناقل يعتمد على الذي تحاول العثور على زاوية ل.

وبالمعنى الدقيق للكلمة، وهما 3D ناقلات دائما <م> اثنين زوايا بينهما - واحد في الأسفل أو يساوي 180، وعلى الآخرين أو يساوي 180. قوس جيب تمام الزاوية يعطي أنت واحد منهم، يمكنك الحصول على البعض من خلال طرح من 360. فكر في الأمر على هذا النحو: تخيل اثنين من خطوط تتقاطع. لديك 4 زوايا هناك - 2 من قيمة واحدة، 2 من آخر. ما هي زاوية ما بين السطور؟ جواب واحد. كذلك هنا. دون نوع من معايير إضافية، لا يمكنك، من الناحية النظرية، معرفة أي من القيم زاوية اثنين يجب أن تؤخذ بعين الاعتبار.

وتحرير: ذلك ما كنت بحاجة إليه فعلا هو مثال التعسفي لتحديد التوجه. هنا واحد: نحن ننظر من الاتجاه Z إيجابي. إذا كانت الطائرة بين ناقلات اثنين تحتوي على محور Z، ونحن ننظر من اتجاه Y إيجابي. إذا كانت الطائرة YZ، ونحن ننظر من اتجاه X إيجابي. سأفكر كيفية التعبير عن هذا في تنسيق النموذج، ثم تحرير مرة أخرى.

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