कोई एक मार्ग की लंबाई कैसे निर्धारित करेगा?


11

मेरे पास एक खेल है जिसमें प्रत्येक खिलाड़ी को एक निर्दिष्ट पथ के साथ जाने की आवश्यकता होती है। मैं Bézier घटता का उपयोग कर रास्ता आकर्षित करता हूं। मैं रास्ते की कुल वास्तविक (रैखिक नहीं) लंबाई और प्रत्येक खिलाड़ी द्वारा तय की गई दूरी को कैसे निर्धारित कर सकता हूं ? (प्रारंभ बिंदु और पथ पर एक निर्दिष्ट बिंदु के बीच की दूरी।)

अपडेट करें:

पथ को कार्टेशियन प्लेन (2D) में दर्शाया गया है।


जवाबों:


7

जैसा कि पिछले जवाबों ने कहा, बेजियर वक्र की लंबाई की गणना करना कठिन ( असंभव ?) है। मैं कहूंगा कि 100% खेल लंबाई के एक अनुमान का उपयोग करते हैं, जो हमेशा बहुत सटीक होता है।

कुछ महीने पहले मैंने वक्र को "छोटे" खंडों में तोड़ने और उनकी लंबाई जोड़ने के प्रस्तावित दृष्टिकोण का उपयोग करके इसे लागू किया था। यहाँ C ++ कार्यान्वयन का एक उदाहरण है


11

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


मैं इस पर विचार कर सकता हूं, लेकिन मैं यह निर्धारित कर सकता हूं कि मेरे पास कितने सेगमेंट होने चाहिए और मैं अपने शुरुआती बिंदु और अपने रास्ते पर अंतिम बिंदु रखने के लिए सेगमेंट को कैसे मैप कर सकता हूं? क्या इस तकनीक का कोई नाम है? (इसलिए मैं इसे Google
वैलेंटाइन रादु

एक सरल तरीका यह होगा कि आप B (0) से B (1) तक अंकों के एक रैखिक वितरण का उपयोग करें ... बहुत कुछ ऐसा जैसा कि आप वास्तव में वक्र को प्लॉट करने के लिए उपयोग करेंगे। दान के उत्तर में स्रोत कोड को देखें।
बुमज़ैक

मैं डाउन-वोट के स्पष्टीकरण की सराहना करता हूं, बस यह जानने के लिए कि मैं अपने उत्तर में क्या सुधार कर सकता हूं ...
bummzack

7

उच्चतर क्रम (यानी 1 क्रम से अधिक) की लंबाई लंबाई के मानकीकरण का अनुमान लगाना होगा; इसका प्रत्यक्ष रूप से प्रतिनिधित्व नहीं किया जा सकता है, इसलिए इस तथ्य का प्रत्यक्ष समाधान खोजना आसान नहीं है।

कुछ मौजूदा कार्यान्वयन (कॉपी-पेस्ट कोड):

लेखकों के अनुसार चेबीशेव का उपयोग करते हुए , वक्र आकार बढ़ने के साथ सटीकता बढ़ती है। पीपी। 7-8 स्यूडोकोड को देखें, बाकी अन्य एल्गोरिदम का वर्णन है, जिस पर उन्होंने अपना दृष्टिकोण आधारित किया है जिसे आप अनदेखा कर सकते हैं। ऑनलाइन कई संदर्भ इस विधि को एक अच्छे के रूप में संदर्भित करते हैं।

इन संक्षिप्त दृष्टिकोणों को भी देखें ।


5

यह @ bmmzack के उत्तर पर टिप्पणी पर एक टिप्पणी के रूप में शुरू हुआ, लेकिन बहुत लंबा हो गया।

मैं यह निर्धारित कर सकता हूं कि मेरे पास कितने सेगमेंट होने चाहिए

दो दृष्टिकोण हैं। बैजियर वक्र प्रदान करने के लिए पहला मानक एल्गोरिथ्म है: नियंत्रण बिंदु वक्र का एक बाउंडिंग बॉक्स बनाते हैं, इसलिए यदि नियंत्रण बिंदु के सभी प्रारंभ बिंदु से लाइन सेगमेंट के एप्सिलॉन के भीतर हैं, तो आप बिंदु को एक रेखा के रूप में अनुमानित करते हैं; अन्यथा आप de Casteljau के एल्गोरिथ्म का उपयोग करके उपविभाजित करते हैं। एप्सिलॉन को उस त्रुटि के अनुसार चुना जाता है जिसे आप अंतिम परिणाम में चाहते हैं। (प्रतिपादन के लिए यह आमतौर पर 0.5 पिक्सेल है)।

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

एक सामान्य रूप से t = 0.5 पर उपविभाजित होता है, लेकिन de Casteljau का एल्गोरिथ्म किसी भी बिंदु पर विभाजन की अनुमति देता है, इसलिए यदि आपके पास नियंत्रण बिंदु C_3 से C_3 तक घन Bzzier है और C_2 की तुलना में समापन बिंदुओं के बीच लाइन खंड बहुत निकट है तो आप पा सकते हैं कि विभाजन 1/3 या 2/3 में से एक तंग सीमा देता है। मैंने बीजगणित के माध्यम से यह साबित करने के लिए काम नहीं किया है कि कौन सा बेहतर होगा, लेकिन आप प्रयोग कर सकते हैं और यदि चाहें तो वापस रिपोर्ट कर सकते हैं। अगर और कुछ नहीं, मैं यह बताना चाहता था कि विकल्प है।


3

पैराट्राइज्ड वक्र की लंबाई की गणना sqrt ((dx / dt) / + (डाई / dt) ²) के अभिन्न अंग द्वारा की जा सकती है, जहां dx / dt वक्र के x- घटक का व्युत्पन्न है, और डाई / dt वक्र के y- घटक का व्युत्पन्न है। एक बेज़ियर-स्पलाइन के मामले में, ये दोनों समान हैं, क्योंकि समीकरण को किसी भी आयाम तक बढ़ाया जा सकता है।

क्यूबियर बेज़ियर-स्पलाइन का सूत्र निम्नलिखित है: B (t) = (1 - t0) * P0 + 3 (1 - t) ²t * P1 + 3 (1 - t) t² * P2 / t³ P3 जहाँ P0 P3 के माध्यम से नियंत्रण बिंदु हैं।

वोल्फ्राम के अनुसार | अल्फा, इस सूत्र का व्युत्पन्न है: d (B (t)) / dt = 3 (t (P3 - P0) + P2 (2 - 3t) + P1 (3t² - 4t + 1))

अब आप इसे वापस वक्र की लंबाई के समीकरण में डाल सकते हैं, और टी = 0 से टी = 1. से अभिन्न गणना कर सकते हैं। दुर्भाग्य से, वुल्फराम | अल्फा बार बाहर जब मैं ऐसा करने की कोशिश करता हूं। हालाँकि, आप संख्यात्मक एकीकरण कर सकते हैं।

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