2012-04-13 21 views
11

(तीन आयामों में) मैं उन वैक्टरों के अलावा अन्य जानकारी के बिना दो वैक्टरों के बीच हस्ताक्षरित कोण की गणना करने का एक तरीका ढूंढ रहा हूं। जैसा कि this question में उत्तर दिया गया है, वैचारिक लंबवत होने वाले विमान के सामान्य होने पर हस्ताक्षरित कोण की गणना करना काफी आसान है। लेकिन मुझे उस मूल्य के बिना ऐसा करने का कोई रास्ता नहीं मिल रहा है। ऐसा नहीं है कि दो वैक्टर के पार उत्पाद इस तरह के एक सामान्य पैदा करता है स्पष्ट है, लेकिन मैं इसके बाद के संस्करण का उपयोग कर जवाब निम्नलिखित विरोधाभास हुई:एक संदर्भ विमान के बिना दो वैक्टरों के बीच हस्ताक्षर कोण

signed_angle(x_dir, y_dir) == 90 
signed_angle(y_dir, x_dir) == 90 

जहाँ मैं दूसरा परिणाम नकारात्मक होने की अपेक्षा करेंगे।

signed_angle(Va, Vb) 
    magnitude = acos(dot(Va, Vb)) 
    axis = cross(Va, Vb) 
    dir = dot(Vb, cross(axis, Va)) 
    if dir < 0 then 
     magnitude = -magnitude 
    endif 
    return magnitude 

मैं नहीं मानता dir कभी ऊपर नकारात्मक होगा: इस तथ्य यह है कि उत्पाद पार cross(x_dir, y_dir)cross(y_dir, x_dir) की विपरीत दिशा में है की वजह से है, सामान्यीकृत इनपुट के साथ निम्नलिखित psuedocode दिया।

मैंने सुझाए गए एटान 2 समाधान के साथ एक ही समस्या देखी है। बनाने के लिए

मैं एक तरह से तलाश कर रहा हूँ:

signed_angle(a, b) == -signed_angle(b, a) 
+1

यह नहीं है: http://www.jtaylor1142001.net/calcjat/Solutions/VDotProduct/VDPTheta3D.htm आप क्या देख रहे हैं? – Jack

+0

उपरोक्त टिप्पणी में लिंक – ephere

उत्तर

1

धन्यवाद सब कुछ।यहां टिप्पणियों की समीक्षा करने के बाद और मैं जो करने की कोशिश कर रहा था, उस पर वापस देखकर, मुझे एहसास हुआ कि मैं एक हस्ताक्षरित कोण के लिए दिए गए, मानक सूत्र के साथ क्या करना चाहता हूं। मैं बस अपने हस्ताक्षरित कोण समारोह के लिए यूनिट परीक्षण में लटका दिया।

संदर्भ के लिए, मैं परिणामस्वरूप कोण को घुमाने वाले फ़ंक्शन में वापस खिला रहा हूं। मैं इस तथ्य के लिए जिम्मेदार नहीं रहा था कि यह स्वाभाविक रूप से उसी अक्ष का उपयोग करेगा जैसा कि हस्ताक्षर_आंगल (इनपुट वैक्टरों का क्रॉस उत्पाद) में है, और रोटेशन की सही दिशा उस दिशा से होगी जो धुरी का सामना कर रही है।

अधिक सीधे शब्दों में, इन दोनों को सिर्फ "सही काम" चाहिए और अलग अलग दिशाओं में बारी बारी से:

rotate(cross(Va, Vb), signed_angle(Va, Vb), point) 
rotate(cross(Vb, Va), signed_angle(Vb, Va), point) 

कहाँ पहला तर्क रोटेशन और दूसरे की धुरी है राशि को घुमाने के लिए है।

3
एक संदर्भ विमान

angle = acos(dotproduct(normalized(a), normalized(b))); 

signed_angle के बिना दो वैक्टर के बीच

हस्ताक्षर कोण (एक, बी) ==-signed_angle (बी, ए)

मुझे लगता है कि किसी प्रकार के संदर्भ वेक्टर के बिना असंभव है।

+0

काम नहीं करता है, मैं इसके बारे में कुछ और सोच रहा था, और यह सही है। कोण का संकेत आपके संदर्भ के रूप में उपयोग किए जाने वाले रोटेशन की धुरी पर निर्भर करता है। और निश्चित रूप से दो अलग-अलग अक्ष हैं, एक क्रॉस उत्पाद की दिशा में और एक विपरीत दिशा में। –

+0

@ जेफ: हाँ, और जब आप क्रॉस उत्पाद का उपयोग करके "घूर्णन" अक्ष पा सकते हैं, तो आप यह निर्धारित नहीं कर सकते कि यह किस दिशा में शुरू हो रहा था - 'एक क्रॉस बी' में या 'बी क्रॉस ए' में - स्वैप वैक्टर, और आप अक्ष को विपरीत दिशा में सामना करेंगे। नतीजतन यह निर्धारित करना असंभव है कि घूर्णन कोण 0..पीआई रेंज के भीतर है या यदि यह पीआई..पीआई * 2 रेंज के भीतर है। – SigTerm

-2

यदि सब आप चाहते हैं एक सुसंगत परिणाम है, तो एक × और के बीच ख × एक अपने सामान्य हो जाएगा के लिए चुनने के किसी भी मनमाने ढंग से रास्ता है। शायद वह लेक्सिकोग्राफिक रूप से छोटा है?

(लेकिन तुम क्या समस्या आप वास्तव में हल करने के लिए कोशिश कर रहे हैं समझाने के लिए चाहते हो सकता है:। शायद वहाँ एक समाधान है कि कंप्यूटिंग मनमाना 3-वैक्टर के बीच एक सुसंगत पर हस्ताक्षर किए कोण को शामिल नहीं करता है)

18

प्रासंगिक गणितीय सूत्रों:

dot_product(a,b) == length(a) * length(b) * cos(angle) 
    length(cross_product(a,b)) == length(a) * length(b) * sin(angle) 

3-डी वैक्टर के बीच एक मजबूत कोण लिए, आपकी वास्तविक गणना होना चाहिए:

s = length(cross_product(a,b)) 
    c = dot_product(a,b) 
    angle = atan2(s, c) 

आपका उपयोग करते हैं अकेले, जब कोण छोटा होता है तो आपको मामलों के लिए गंभीर परिशुद्धता समस्याएं मिलेंगी। कंप्यूटिंग s और atan2() का उपयोग करके आप सभी संभावित मामलों के लिए एक मजबूत परिणाम देते हैं।

चूंकि s हमेशा गैर-नकारात्मक है, परिणामी कोण 0 से पीआई तक होगा। हमेशा समकक्ष नकारात्मक कोण (angle - 2*pi) होगा, लेकिन इसे पसंद करने के लिए कोई ज्यामितीय कारण नहीं है।

+0

धन्यवाद, मैं इसे एकोस के बारे में रखूंगा। मुझे लगता है कि जब आप फ़ंक्शन को विज़ुअलाइज़ करते हैं तो यह स्पष्ट होता है। – metatheorem

+0

चेतावनी: यह फ़ंक्शन कम्यूटिव है, और यह नहीं होना चाहिए: + x दिशा (1 0 0) से + y दिशा (0 1 0) से कोण + 90 डिग्री होना चाहिए। इसके विपरीत, + y से + x तक, -90 डिग्री होना चाहिए। लेकिन इस समारोह के साथ, 'एफ (एक्स, वाई) == एफ (वाई, एक्स) '। यह अंतर नहीं बता सकता क्योंकि 's' गैर-ऋणात्मक है, और यह कि क्रॉस-उत्पाद एकमात्र चीज है जो आपको दोनों के बीच की दिशा के बारे में बता सकती थी। –

+0

यदि यह 2 आयामों में था, तो यह विरोधी-कम्यूटिव होगा। हालांकि, 3 आयामों में, यह (और होना चाहिए) कम्यूटेटिव - क्योंकि, 3 आयामों में, आपको chirality निर्धारित करने के लिए एक तीसरे वेक्टर की आवश्यकता होती है। पहले दो के लिए सकारात्मक और नकारात्मक कोणों के बीच भेदभाव करने के लिए तीसरे वेक्टर के बिना, आपके पास एक दिशा को प्राथमिकता देने के लिए कोई ज्यामितीय कारण नहीं है। – comingstorm