क्या मैं असमानता को "दूरी (पी 1, पी 2) <दूरी (पी 1, पी 3)?"


14

मैं कुछ वेक्टर तर्क पर काम कर रहा हूं, इसलिए मैं पूछ रहा हूं: क्या मैं इस असमानता को सरल करके प्रोसेसर समय बचा सकता हूं:

distance(vector1, vector2) < distance(vector1, vector3)

मैं देखता हूं कि vector1दोनों मामलों में दोहराया जाता है।


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

3
@ माइक की टिप्पणी जारी रखने के लिए, प्रदर्शन केवल इस तरह के मामलों में सार का होना चाहिए यदि आपने पहले से ही विश्लेषण या प्रोफाइलिंग किया है और इस कॉल को एक अड़चन के रूप में पहचाना है। यदि हम 305fps और 303fps के बीच अंतर की बात कर रहे हैं, तो स्थिरता बरकरार रहती है।
फॉशी

जवाबों:


24

हां , आप इसे सरल बना सकते हैं। सबसे पहले, उन्हें वैक्टर कहना बंद करें। वे बिंदु हैं। चलो उन्हें बुलाओ A, Bऔर C

तो, आप यह चाहते हैं:

dist(A, B) < dist(A, C)

वर्गों के साथ दूरी को बदलें, फिर डॉट उत्पादों के साथ (की परिभाषा से) यूक्लिडियन लंबाई )। (अब ये असली वैक्टर हैं) के ACसाथ बदलें AB + BC। विस्तार, सरलीकरण, कारक:

dist(A, B < dist(A, C
dot(AB, AB) < dot(AC, AC)
dot(AB, AB) < dot(AB + BC, AB + BC)
dot(AB, AB) < dot(AB, AB) + dot(BC, BC) + 2 dot(AB, BC)
0 < dot(BC, BC) + 2 dot(AB, BC)
0 < dot(BC + 2 AB, BC)

तुम यहां हो:

dot(AB + AC, BC) > 0

अपने वेक्टर संकेतन के साथ:

dot(v2 - v1 + v3 - v1, v3 - v2) > 0

यह पिछले दो डॉट उत्पादों के बजाय कुछ अतिरिक्त और एक डॉट उत्पाद है।


क्या आप बता सकते हैं कि आप डॉट उत्पाद संस्करण के साथ + b b = a + c को कैसे बदल सकते हैं ?
ट्रैविसग

2
@TravisG मुझे यकीन नहीं है कि आप क्या पूछ रहे हैं। यदि आपका प्रश्न ऐसा dist(A, B)²ही है तो dot(AB, AB)यह यूक्लिडियन लंबाई की परिभाषा से आता है ।
सैम होसेवर

2
स्पष्ट रूप से यह (कुछ) समीकरण को गणितीय रूप से सरल करता है, लेकिन ओपी के लिए "प्रोसेसर समय को बचाने" जरूरी नहीं होगा। यह मूल दूरी समीकरणों से वर्गमूल को हटाने की तुलना में अधिक जटिलता और अधिक गणना में परिणाम करता है।
MichaelHouse

1
मुझे सही है अगर मैं गलत हूं, लेकिन दो डॉट-उत्पाद प्रति ऑपरेशन 5 उत्पाद हैं, साथ ही दो vec3 विकल्प हैं जो कुल 16 ऑपरेशन हैं, आपके रास्ते में 3 vec3 विकल्प हैं और एक जोड़ है जो 12 ऑपरेशन प्लस डॉट उत्पाद बनाता है 17 बनाता है।
लुइस डब्ल्यू

2
दिलचस्प रूप से पर्याप्त है, परिणाम एक समांतर चतुर्भुज के दो विपरीत विकर्णों का डॉट-उत्पाद है। लेकिन वह अप्रासंगिक है। मैं जो कहना चाहता था वह यह है कि इस पूर्ण सरलीकरण से प्राप्त होने वाली कोई जबरदस्त राशि नहीं है ; जैसा कि दूसरों ने उल्लेख किया है कि यह वास्तव में गणना करने के लिए आप जो प्रयास कर रहे हैं, उसे बाधित या जटिल करने के लिए एक सभ्य राशि है। हालाँकि, आप निश्चित रूप से पहले चरण का उपयोग करना चाहते हैं। एक अनावश्यक वर्गमूल से बचना हमेशा इसके लायक है। बस दूरी के वर्गों की तुलना एक ही है, क्योंकि दूरी सकारात्मक है, यहां तक ​​कि जटिल विमान में भी।
TASagent

16

हाँ।मान लें कि आपका distanceफ़ंक्शन एक वर्गमूल का उपयोग करता है, तो आप वर्गमूल को हटाकर इसे सरल कर सकते हैं।

दूरी के बड़े (या छोटे) को खोजने की कोशिश करते समय, x^2 > y^2 अभी भी सही है x > y

हालाँकि, गणितीय समीकरण को सरल बनाने के और प्रयास निरर्थक हैं। के बीच की दूरी vector1और vector2के बीच की दूरी के रूप में ही नहीं है vector1और vector3। जबकि सैम के उत्तर के रूप में समीकरण को गणितीय रूप से सरल बनाया जा सकता है , यह वर्तमान में जिस रूप में संभव है वह उतना ही सरल है जितना आप प्रोसेसर के परिप्रेक्ष्य से प्राप्त करेंगे।


मेरे पास पर्याप्त प्रतिनिधि नहीं है, लेकिन जैसा कि यह मौलिक रूप से गलत है, मैं मानता हूं: "क्या मैं इस असमानता को सरल करके प्रोसेसर समय बचा सकता हूं?" इसका जवाब है हाँ।
im इतना उलझन में

उत्तर केवल हां में है यदि दूरी समीकरण एक वर्गमूल का उपयोग कर रहा है। जिसका मैं उल्लेख करता हूँ।
MichaelHouse

मान्य बिंदु, मैं अपना बयान वापस लूंगा। हालांकि, यह 99% गारंटी है कि उपयोगकर्ता का अर्थ यूक्लिडियन दूरी sqrt (राशि (आयामी अंतर चुकता)) है
im इतना भ्रमित

@imsoconfused मेला, मैंने सबसे अधिक संभावना (99%) परिदृश्य के लिए अपने उत्तर के क्रम को बदल दिया है।
MichaelHouse

2
हां, मेरा अनुभव यह है कि जब आप इस प्रकार के सामान के साथ काम कर रहे होते हैं, तो एक दूरस्थ वितरण फ़ंक्शन बहुत उपयोगी होता है। यह उतना ही स्पष्ट है और महंगा sqrt ऑपरेशन से बचा जाता है।
लोरेन Pechtel

0

कुछ गणित मदद कर सकता है।

आप क्या करने की कोशिश कर रहे हैं:

<v1, v2> < <v1, v3> =>
sqrt((y2-y1)^2+(x2-x1)^2) < sqrt((y3-y1)^2+(x3-x1)^2) =>
y2^2 - 2*y2y1 + y1^2 + x2^2 - 2*x2x1 + x1^2 < y3^2 - 2*y3y1 + y1^2 + x3^2 - 2*x3x1 + x1^2

क्या आप दोहराया चर हटा सकते हैं और कुछ अन्य लोगों को समूह से। आपको जो ऑपरेशन करना है, वह है:

y3^2 - y2^2 - 2*y1(y3-y2) + x3^2 - x2^2 - 2*x1(x3-x2) > 0

आशा करता हूँ की ये काम करेगा।


-1

वास्तविक प्रश्न यह प्रतीत होता है कि निकटतम वस्तु के निर्धारण के लिए अभिकलन को कैसे कम किया जाए?

इसका अनुकूलन अक्सर खेलों में किया जाता है, हालांकि सभी अनुकूलन के साथ इसे प्रोफ़ाइल-निर्देशित किया जाना चाहिए और, अक्सर, चीजों को सरल नहीं करता है ।

निकटतम चीज़ को निर्धारित करने के लिए अनावश्यक दूरी की गणना से बचने का तरीका - या एक निश्चित सीमा के भीतर सभी चीजें - एक स्थानिक सूचकांक का उपयोग करना है जैसे एक ऑक्ट्री

यह केवल तभी भुगतान करता है जब बड़ी संख्या में ऑब्जेक्ट होते हैं। सिर्फ तीन वस्तुओं के लिए, यह भुगतान करने की संभावना नहीं है और निश्चित रूप से कोड को सरल नहीं करता है ।


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

मैं इसे अस्वीकार कर रहा हूं क्योंकि एक संभावित समय से पहले अनुकूलन को लागू करना एक समस्या का जवाब नहीं है, जहां स्पष्ट अनुकूलन या तो पठनीयता, कोड स्थिरता को नुकसान नहीं पहुंचाता है , और न ही यह अस्पष्ट प्रथाओं को प्रोत्साहित करता है। जब आप वास्तव में सरल और अनुकूलित कोड लिख सकते हैं, तो क्यों नहीं? यह निश्चित रूप से इसे करने के लिए चोट नहीं करता है, भले ही आपके पास एक उच्च स्तरीय योजना हो (कोई गेम डेवलपर प्रति फ्रेम, एस्प पर कंसोल पर कुछ अतिरिक्त माइक्रोसेकंड मना नहीं करेगा)।
टेओड्रन

@teodron: "जब आप वास्तव में सरल और अनुकूलित कोड लिख सकते हैं, तो ऐसा क्यों नहीं करते?" - क्योंकि ओपी (और अब, हम) ने अब एक गैर-लापरवाही राशि खर्च की है, जो किसी चीज का अनुकूलन कर रही है जिससे उसे कोई लाभ नहीं हो सकता है।
ब्लूराजा - डैनी पफ्लुगुएफ्ट

@ BlueRaja-DannyPflughoeft मैं इसके साथ सहमत हूं कि एक मामूली (इसलिए महत्वहीन अनुकूलन अगर कुछ सौ कॉल प्रति फ्रेम के लिए उपयोग किया जाता है, लेकिन अगर परिमाण का कारक हजारों तक बढ़ जाता है, तो चीजें निश्चित रूप से बदल जाती हैं)। हालाँकि, हम कुछ ऐसा करने के लिए स्वतंत्र नहीं हैं जो किसी ऐसे उत्तर का जवाब देने / अनुकूलित करने की कोशिश में समय बर्बाद न करें जो व्यवहार्य न हो। ओपी ने एक बात पूछी, लोगों ने माना कि ओपी को उच्च स्तरीय रणनीतियों और रूपरेखा प्रथाओं के बारे में पता नहीं था। मैं व्यक्तिगत रूप से टिप्पणियों में ऐसी टिप्पणी करना पसंद करता हूं, जवाबों में नहीं। इतनी
क्रिया

-3

यह इस बात पर निर्भर करता है कि दूरी (v1, v2) का आउटपुट क्या है

यदि यह एक सदिश पर एक दशमलव (फ्लोट या डबल) है तो संभावना है कि दूर का भाग बहुत तेज होगा


5
मैं यह नहीं देखता कि इसका किसी floatचीज से क्या लेना-देना है।
MichaelHouse

मेरा मतलब है कि एक और वेक्टर पर एक नाव को विशेष रूप से अच्छी तरह से समझाया नहीं गया (और मुझे लगता है कि आप जानते थे कि)
रफप्लेस

5
मैं जानबूझकर गलतफहमी में नहीं था। मुझे अभी भी यकीन नहीं है कि आपका क्या मतलब है। मुझे नहीं पता कि क्यों एक दूरी समारोह एक वेक्टर लौटाएगा।
MichaelHouse
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.