2012-01-08 18 views
8

आइए कहें कि मेरे पास मनमाना वेक्टर ए है। मनमानी राशि से वैक्टर परिमाण को कम करने का सबसे प्रभावी तरीका क्या है?एक विशिष्ट लंबाई से एक वैक्टर परिमाण को कम करने के लिए कुशल तरीका?

Vector shortenLength(Vector A, float reductionLength) { 

    Vector B = A; 
    B.normalize(); 
    B *= reductionLength; 
    return A - B; 

} 

वहाँ एक और अधिक कुशल तरीका यह है है:

मेरे वर्तमान विधि इस प्रकार है? संभावित रूप से बी को सामान्य करने के लिए आवश्यक वर्ग रूट को हटा रहा है ...

+1

ओह यह एक गणित वेक्टर है, सी ++ वेक्टर नहीं। मैं भ्रमित था। –

+0

मुझे नहीं लगता कि सामान्य मामले के लिए वर्ग रूट किए बिना सामान्य बनाना संभव है, और हर दूसरे ऑपरेशन को तेज़ होना चाहिए। मुझे नहीं लगता कि आप प्रतियों से बचकर छोड़कर उस गति को हरा देंगे। –

+0

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

उत्तर

7

तो अगर मैं आपको सही ढंग से समझता हूं, तो आपके पास वेक्टर A है, और एक और वेक्टर चाहता है जो A के समान दिशा में इंगित करता है, लेकिन reductionLength से छोटा है, है ना?

क्या Vector इंटरफ़ेस में "लंबाई" सदस्य फ़ंक्शन (वेक्टर की लंबाई लौटने) की तरह कुछ है? तो मुझे लगता है कि निम्नलिखित अधिक कुशल होना चाहिए:

Vector shortenLength(Vector A, float reductionLength) 
{ 
    Vector B = A; 
    B *= (1 - reduction_length/A.length()); 
    return B; 
} 
+0

आमतौर पर एक वेक्टर का "सामान्यीकरण" का अर्थ है "एक ही दिशा, लेकिन लंबाई 1। उसका कोड एक वेक्टर बना रहा है जो" कमीशन लम्बाई "की लंबाई के साथ एक ही दिशा है। पाठ का तात्पर्य है कि कोड पूरी तरह से गलत है। –

+0

@ MooingDuck: वह * एक वेक्टर * घटा रहा है जिसे वह पहले सामान्यीकृत करके प्राप्त करता है और फिर मूल वेक्टर से 'कमी लम्बाई' * के साथ गुणा करता है। * जिसका अर्थ है कि वह एक वेक्टर प्राप्त करता है जो एक ही दिशा में इंगित करता है, लेकिन 'कमी लम्बाई' से छोटा होता है (मानते हुए कि मूल वेक्टर 'कमीशन लम्बाई' से शुरू होने के लिए लंबा था) – celtschk

+0

ओह हाँ, उस अंतिम पंक्ति को भूल गया। सुनिश्चित नहीं है कि यह कैसे हुआ। –

4

यदि आप स्केलर मान से गुणा करके वेक्टर को स्केल करने जा रहे हैं, तो आपको सामान्यीकृत करना चाहिए। दक्षता कारणों के लिए नहीं; क्योंकि नतीजा वह नहीं है जो आप शायद चाहते हैं।

v = (3, 4) 

इसका परिमाण sqrt(3^2 + 4^2) = 5 है:

मान लीजिए कि आप एक सदिश कि इस तरह दिखता है करते हैं। तो चलो इसे सामान्य करें:

n = (0.6, 0.8) 

इस वेक्टर में परिमाण 1 है; यह एक इकाई वेक्टर है।

तो यदि आप 0.5 के कारक से प्रत्येक को "छोटा" करते हैं, तो आपको क्या मिलता है?

shortened v = (3, 4) * 0.5 = (1.5, 2.0) 

अब वह अपने परिमाण sqrt से सामान्य हैं (6.25):

normalized(shortened v) = (1.5/2.5, 2/2.5) = (0.6, 0.8) 

हम इकाई वेक्टर के लिए एक ही बात करते हैं:

shortened(normalized v) = (0.6, 0.8) * 0.5 = (0.3, 0.4) 

ये एक ही बात नहीं कर रहे हैं बिलकुल। आपकी विधि दो चीजें करता है, और वे कम्यूटिव नहीं हैं।

+1

मैं कल्पना नहीं कर सकता कि इसे क्यों वोट दिया जाएगा। इसके साथ गलत क्या है? – duffymo

+0

शायद यह तथ्य है कि उन्होंने कहीं भी कहा और न ही निहित किया कि वह अपने वेक्टर को स्केलर मान 'कमी लम्बाई' से गुणा करना चाहता है। दूसरे शब्दों में, आपका उत्तर उनके प्रश्न का उत्तर नहीं देता है। (बीटीडब्लू, मैं वह नहीं हूं जिसने आपको वोट दिया है।) – celtschk

+0

आप क्या सोचते हैं कि "* =" ऑपरेटर उस वेक्टर पर कर रहा है? यदि आप वैक्टरों के बारे में कुछ जानते हैं तो यह निश्चित रूप से निहित है। – duffymo

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^