वैक्टर के बीच कंप्यूटिंग कोणों का संख्यात्मक रूप से स्थिर तरीका


14

दो वैक्टर के बीच के कोण के लिए शास्त्रीय सूत्र को लागू करते समय:

α=arccosv1v2v1v2

एक पाता है कि, बहुत छोटे / तीव्र कोणों के लिए, सटीकता का नुकसान होता है और परिणाम सटीक नहीं होता है। जैसा कि इस स्टैक ओवरफ्लो उत्तर में बताया गया है , एक समाधान इसके बजाय आर्कटैगेंट का उपयोग करना है:

α=arctan2(v1×v2,v1v2)

और यह वास्तव में बेहतर परिणाम देता है। हालांकि, मुझे आश्चर्य है कि अगर यह कोणों के लिए खराब परिणाम देगा, जो कि \ pi / 2 के बहुत करीब होगा π/2। क्या यह मामला है? यदि हां, तो क्या किसी ifशाखा के अंदर सहिष्णुता की जांच किए बिना कोणों की सटीक गणना करने का कोई सूत्र है ?


1
यह दो पैरामीटर उलटा स्पर्श समारोह के कार्यान्वयन पर निर्भर करने वाला है। धीमी, स्थिर संस्करण सटीक रूप से बनाए रखने के लिए x / y और y / x के साथ काम करने के बीच सशर्त रूप से स्विच करते हैं, जबकि तेज़ लोग सिर्फ सही चतुर्थांश में चीजों को चिपकाते हैं और इस प्रकार एक पैरामीटर संस्करण की तुलना में अधिक सटीक नहीं होते हैं।
ओरिगम्बो

आपको "सटीकता की हानि" को परिभाषित करना चाहिए: मान लें कि सही उत्तर α और आपको इसके बजाय α+Δ । क्या आपको Δα या Δπ पर्याप्त है?
स्टेफानो एम

इस मामले में, सही उत्तर था और मुझे , दोनों । αα1081
astrojuanlu

जवाबों:


18

( मैंने पहले इस दृष्टिकोण का परीक्षण किया है, और मुझे याद है कि यह सही ढंग से काम किया है, लेकिन मैंने इस प्रश्न के लिए विशेष रूप से परीक्षण नहीं किया है। )

जहाँ तक मैं बता सकता हूँ, दोनों और भयावह निरस्तीकरण से पीड़ित हो सकते हैं यदि वे लगभग समानांतर / लंबवत हैं - atan2 आपको अच्छा सटीकता नहीं दे सकता है यदि इनपुट बंद है।v1×v2v1v2

समस्या को सुधारने के द्वारा शुरू करें जैसे कि त्रिभुज के कोण को साइड की लंबाई के साथ खोजना,और(ये सभी फ्लोटिंग पॉइंट अंकगणित में सटीक रूप से गणना की गई हैं)। हेरान के फार्मूले का एक सुप्रसिद्ध रूप है, जो कहन ( एक सुई की तरह त्रिभुज के विविध क्षेत्र और कोण ) के कारण होता है, जो आपको इसकी लंबाई के साथ निर्दिष्ट त्रिकोण के क्षेत्र और कोण ( और बीच ) की गणना करने की अनुमति देता है , और संख्यात्मक रूप से ऐसा करें। चूँकि इस उपप्रकार में कमी सही है, इसलिए यह दृष्टिकोण मनमाने आदानों के लिए काम करना चाहिए।a=|v1|b=|v2|c=|v1v2|ab

उस पेपर से उद्धृत करना (p.3 देखें), , यहाँ सभी कोष्ठक सावधानी से रखे गए हैं, और वे मायने रखते हैं; यदि आप अपने आप को एक ऋणात्मक संख्या के वर्गमूल को लेते हुए पाते हैं, तो इनपुट पक्ष की लंबाई एक त्रिकोण की लंबाई नहीं है।ab

μ={c(ab),if bc0,b(ac),if c>b0,invalid triangle,otherwise
angle=2arctan(((ab)+c)μ(a+(b+c))((ac)+b))

इस बात की व्याख्या है कि यह कैसे काम करता है, जिसमें मूल्यों के उदाहरण शामिल हैं, जिनके लिए अन्य सूत्र विफल होते हैं, काहान के पेपर में। के लिए आपका पहला सूत्र है पेज 4 पर।αC

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

स्टेफानो की टिप्पणी के बाद संपादित करें , मैंने , ( कोड ) के लिए सापेक्ष त्रुटि की साजिश रची । दो पंक्तियाँ और लिए सापेक्ष त्रुटियाँ हैं , क्षैतिज अक्ष के साथ जा रही हैं। ऐसा लगता है कि यह काम करता है। v1=(1,0)v2=(cosθ,sinθ)θ=ϵθ=π/2ϵϵयहाँ छवि विवरण दर्ज करें


लिंक और उत्तर के लिए धन्यवाद! दुर्भाग्य से मैंने जो दूसरा सूत्र लिखा था वह लेख में दिखाई नहीं देता। दूसरी ओर, यह विधि थोड़ी जटिल हो सकती है, क्योंकि इसमें 2D में प्रोजेक्शन की आवश्यकता होती है।
एस्ट्रोजुनलू

2
@astrojuanlu यहां 2d का कोई प्रक्षेपण नहीं है: जो कुछ भी दो 3 डी वैक्टर हैं, वे उनके बीच एक एकल (प्लैनर) त्रिकोण को परिभाषित करते हैं - आपको केवल इसकी लंबाई लंबाई जानने की आवश्यकता है।
किरिल

आप सही हैं, मेरी टिप्पणी का कोई मतलब नहीं है। मैं लंबाई के बजाय निर्देशांक में सोच रहा था। एक बार फिर धन्यवाद!
astrojuanlu

2
@astrojuanlu एक और बात जो मैं नोट करना चाहता हूं: ऐसा लगता है कि एक औपचारिक साक्ष्य है कि कैसे एक त्रिभुज के क्षेत्र की गणना करने के लिए क्षेत्र सूत्र सटीक है : फ़्लिप का उपयोग करते हुए एक फॉर्मल रीविसिट , सिल्वी बोल्डो।
किरिल

बहुत बढ़िया जवाब, लेकिन मैं विवाद है कि आप हमेशा सही ढंग से गणना कर सकते हैं चल बिन्दु गणित में। वास्तव में अगर तो के घटकों की गणना करने में भयावह रद्द होती है । cc<ϵmin(a,b)(v1v2)
स्टेफानो एम

7

इस सवाल का कुशल जवाब, आश्चर्य की बात नहीं है, वेवेल काहन द्वारा एक अन्य नोट में :

α=2arctan(v1v1+v2v2,v1v1v2v2)

जहां मैं क्षैतिज अक्ष के साथ कोण द्वारा बनाए गए कोण के रूप में उपयोग करता हूं । (आपको कुछ भाषाओं में तर्कों के क्रम को पलटना पड़ सकता है।)arctan(x,y)(x,y)

(मैंने यहां काहन के सूत्र का एक गणितीय प्रदर्शन दिया ।)


आप मतलब है ? arctan2
astrojuanlu

1
मैं सिर्फ दो-तर्क के रूप में रूप में चित्रण करने के लिए उपयोग किया जाता हूं । फोरट्रान जैसी भाषा में, समकक्ष होगा । arctan(x,y)ATAN2(Y, X)
JM
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.