दो वैक्टर के बीच कोण पाने के लिए मैं डॉट उत्पाद का उपयोग कैसे करूँ?


16

मैं अपने खेल में सामान्यीकृत वैक्टर का उपयोग करना सीख रहा हूं।

मैंने सीखा है कि दो वैक्टर के बीच के कोण को जानने के लिए, मैं डॉट उत्पाद का उपयोग कर सकता हूं। यह मुझे -1 और 1 के बीच का मान देता है, जहां

  • 1 का अर्थ है कि वैक्टर समानांतर हैं और समान दिशा (कोण 180 डिग्री) का सामना कर रहे हैं।
  • -1 का मतलब है कि वे समानांतर हैं और विपरीत दिशाओं (अभी भी 180 डिग्री) का सामना कर रहे हैं।
  • 0 इसका मतलब है कि उनके बीच का कोण 90 डिग्री है।

मैं जानना चाहता हूं कि दो वैक्टरों के डॉट उत्पाद को डिग्री में वास्तविक कोण में कैसे परिवर्तित किया जाए। उदाहरण के लिए, यदि दो वैक्टर का डॉट उत्पाद है 0.28, तो 0 और 360 डिग्री के बीच, संबंधित कोण क्या है?


1
ध्यान दें कि डॉट उत्पाद का आपका इच्छित उपयोग केवल तभी काम करता है जब प्रारंभिक वैक्टर यूनिट वैक्टर होते हैं।
सम होसेवार २ sam

@ समोसेश्वर हां, मेरा यही मतलब है।
user3150201


1
@ user3150201 एलेक्स का जवाब सही है, लेकिन आपको यह भी विचार करना चाहिए कि क्या आपको वास्तविक कोण को डिग्री में प्राप्त करने की आवश्यकता है। एकमात्र मामला जहां मैं यह सोच सकता हूं कि जहां यह वास्तव में आवश्यक है, यूआई पर डिग्री में कुछ प्रदर्शित करना होगा। अन्यथा, संभवतः कुछ अनुप्रयोग हैं जहाँ आप साइन और कोसाइन के साथ सीधे काम नहीं कर सकते हैं।
ट्रैविसग जी

जवाबों:


22

dot(A,B) = |A| * |B| * cos(angle)
जिसे फिर से व्यवस्थित किया जा सकता है
angle = arccos(dot(A,B) / (|A|* |B|))

इस सूत्र के साथ, आप दो वैक्टरों के बीच सबसे छोटा कोण पा सकते हैं, जो 0 और 180 डिग्री के बीच होगा। यदि आपको इसकी आवश्यकता 0 और 360 डिग्री के बीच है तो यह प्रश्न आपकी मदद कर सकता है।


वैसे, एक ही दिशा में इंगित दो समानांतर वैक्टर के बीच का कोण 0 डिग्री होना चाहिए, 180 नहीं।


+1 के लिए "वैसे, एक ही दिशा में इंगित दो समानांतर वैक्टर के बीच का कोण 0 डिग्री होना चाहिए, 180 नहीं।"
तारा

8

मैं ट्रैविस जी की टिप्पणी पर थोड़ा विस्तार करूंगा और एक और जवाब दूंगा, जिससे इस तथ्य का उपयोग किया जाएगा कि आपके प्रश्न में "2 डी" टैग था।

आप डॉट उत्पाद का उपयोग करके दो वैक्टरों के बीच का कोण प्राप्त कर सकते हैं, लेकिन आप इसका उपयोग करते हुए दो वैक्टरों के बीच हस्ताक्षरित कोण प्राप्त नहीं कर सकते । एक और तरीका रखो, यदि आप किसी बिंदु की ओर समय के साथ एक चरित्र को मोड़ना चाहते हैं, तो डॉट उत्पाद आपको कितना मोड़ना है लेकिन किस दिशा में नहीं। हालाँकि, एक और सरल सूत्र है, जो डॉट उत्पाद के साथ संयुक्त होने पर बहुत उपयोगी है। न केवल आपके पास है

dot(A,B) = |A| * |B| * cos(angle)

आपके पास एक और सूत्र भी हो सकता है (जिसका नाम मैंने राजनीतिक शुद्धता के लिए बनाया है):

pseudoCross(A,B) = |A| * |B| * sin(angle)

जहाँ यदि A = (a, b), B = (x, y), तो pseudoCross (A, B) को क्रॉस उत्पाद (a, b, 0) x (x, y, 0) के तीसरे घटक के रूप में परिभाषित किया जाता है )। दूसरे शब्दों में:

a*x+b*y = |A| * |B| * cos(angle)

-b*x+a*y = |A| * |B| * sin(angle)

पूर्ण हस्ताक्षरित कोण तब है angle=atanfull(-b*x+a*y,a*x+b*y)(यदि आप गैर-सामान्यीकृत मानों में पास हो जाते हैं तो एटानफुल या एटैन 2 फ़ंक्शन आपको माफ कर देते हैं)। यदि A और B को सामान्यीकृत किया जाता है, अर्थात, यदि |A|=|B|=1ये बस हैं:

a*x+b*y = cos(angle)

-b*x+a*y = sin(angle)


गहरी व्याख्या के लिए, ध्यान दें कि उपरोक्त समीकरण मैट्रिक्स समीकरण द्वारा व्यक्त किए जा सकते हैं:

[ a,b]   [x]   [cos(angle)]
[-b,a] * [y] = [sin(angle)]

लेकिन ए और बी के रूप में व्यक्त किया जा सकता है a=cos(ang1), b=sin(ang1)कुछ मूल्य के लिए ang1(नहीं angle)। इसलिए, बाईं ओर का मैट्रिक्स एक रोटेशन मैट्रिक्स है, जो राशि -ang1 द्वारा वेक्टर (x, y) को घुमाता है। यह संदर्भ के एक फ्रेम में स्विच करने के बराबर है जहां इकाई वेक्टर "ए" को वेक्टर / अक्ष (1,0) के रूप में माना जाता है! तो बस इस फ्रेम में यूनिट सर्कल / राइट त्रिकोण ड्राइंग करके, आप देख सकते हैं कि उस उत्पाद का परिणामी वेक्टर क्यों है (कॉस (कोण), पाप (कोण))।

यदि आप ध्रुवीय रूप में (ए, बी) और (एक्स, वाई) लिखते हैं, और कोण अंतर के फार्मूले को लागू करते हैं cos(l)*cos(m)+sin(l)*sin(m)=cos(l-m)और sin(l)*cos(m)-cos(l)*sin(m)=sin(l-m), आप फिर से व्यक्त करते हैं कि साइन / कोज़ाइन इस उत्पाद द्वारा दिए गए हैं, क्योंकि (एलएम) = कोण। वैकल्पिक रूप से, उन पहचानों का उपयोग यह देखने के लिए किया जा सकता है कि ऊपर दिया गया रैखिक उत्पाद वेक्टर को घुमाता क्यों है।

इन सभी पहचानों का मतलब है कि आपको शायद ही कोण की आवश्यकता है। क्योंकि कोण अजीब हो सकते हैं - रेडियन / डिग्री, उलटा साइन / कोसाइन के लिए सम्मेलनों, तथ्य यह है कि वे हर 2 * पी को दोहराते हैं - यह वास्तव में अधिक उपयोगी हो सकता है और आपको "अगर (कोण <180)" आदि तर्क का एक गुच्छा बचा सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.