जवाबों:
यहाँ मेरी कोशिश है। निम्नलिखित एल्गोरिदम परिपूर्ण से बहुत दूर हैं , लेकिन वे सरल हैं और मेरा मानना है कि आपको इसके साथ शुरू करना चाहिए, जांचें कि क्या वे आपकी स्थिति में काम करते हैं, और बाद में कुछ और / या अधिक सटीक स्विच करते हैं।
विचार निम्नलिखित है:
बेज़ियर वक्र F(t)
नियंत्रण बिंदुओं के एक सेट और एक अलग पैरामीटर का उपयोग करके एक फ़ंक्शन द्वारा पैरामीट्राइज़ किया जाता है t
। उत्पादक बिंदुओं की संख्या महत्वहीन है।
लाइन दो अंकों से parametrised है A
और B
।
SAMPLES = 10
उदाहरण के लिए दें
के साथ शुरू करो t0 = 0
औरt1 = 1
चलो dt = (t1 - t0) / SAMPLES
यदि dt < 1e-10
(या किसी अन्य सटीकता की स्थिति जिसे आप फिट देखते हैं), एल्गोरिथ्म समाप्त हो गया है और उत्तर हैF(t0)
।
SAMPLES + 1
Bézier वक्र पर बिंदुओं की एक सूची की गणना करें :
L[0] = F(t0)
L[1] = F(t0 + dt)
L[2] = F(t0 + 2 * dt)
L[SAMPLES] = F(t0 + SAMPLES * dt)
पता लगाएं कि L
सूचकांक के साथ कौन सा बिंदु i
रेखा के सबसे करीब है। आपके द्वारा ज्ञात किसी भी बिंदु / रेखा दूरी विधि का उपयोग करें , उदाहरण के लिए वर्ग दूरी ||AB^L[i]A||² / ||AB||²
जहां ^
क्रॉस उत्पाद को दर्शाता ||…||
है और दूरी है।
अगर i == 0
, सेट i = 1
; अगर i == SAMPLES
, सेटi = SAMPLES - 1
चलो t1 = t0 + (i + 1) * dt
औरt0 = t0 + (i - 1) * dt
चरण 3 पर वापस जाएं।
इस बार हमारे पास दो बेज़ियर कर्व्स हैं, जिनके द्वारा पैराट्राइज़्ड F(t)
और G(t)
।
SAMPLES = 10
उदाहरण के लिए दें
के साथ शुरू करो t0 = 0
, t1 = 1
, s0 = 0
औरs1 = 1
चलो dt = (t1 - t0) / SAMPLES
चलो ds = (s1 - s0) / SAMPLES
यदि dt < 1e-10
(या किसी अन्य सटीकता की स्थिति जिसे आप फिट देखते हैं), एल्गोरिथ्म समाप्त हो गया है और उत्तर हैF(t0)
।
यदि यह लूप का पहला रन है:
6.1। SAMPLES + 1
बिंदुओं की एक सूची की गणना करें F
( ऊपर देखें )।
6.2। SAMPLES + 1
बिंदुओं की एक सूची की गणना करें G
।
6.3। जानें कि कौन से बिंदु एक दूसरे के सबसे करीब हैं।
6.4। अद्यतन t0
, t1
, s0
, s1
ऊपर देखा के रूप में।
ELSE : वैकल्पिक रूप से F
या बिंदुओं की एक सूची पर बिंदुओं की एक सूची की गणना करते हैं G
, फिर पाते हैं कि कौन सा बिंदु F
निकटतम है G(s0)
और अपडेट करें t0
और t1
, या किस बिंदु के G
सबसे करीब है F(t0)
और अपडेट करें s0
और s1
।
चरण 3 पर वापस जाएं।
डिजाइन द्वारा, ये एल्गोरिदम हमेशा एक स्थानीय न्यूनतम में परिवर्तित होंगे। हालांकि, इस बात की कोई गारंटी नहीं है कि वे सबसे अच्छे समाधान के लिए अभिसरित होंगे। विशेष रूप से, Bézier कर्व एल्गोरिथ्म बहुत अच्छा नहीं है, और दो घटता एक दूसरे के करीब कई स्थानों पर होने के मामले में आप दुर्भाग्य से एक लंबे शॉट द्वारा समाधान याद कर सकते हैं।
लेकिन जैसा कि मैंने कहा, इससे पहले कि आप अधिक मजबूत समाधानों के बारे में सोचना शुरू करें, आपको पहले उन सरल लोगों के साथ प्रयोग करना चाहिए।
1) सब कुछ एक अक्ष पर अनुवाद करें, इसलिए एक बिंदु की लंबाई की गणना करने के बजाय, 'लाइन', 'लाइन', का कहना है, वाई-एक्सिस।
फिर, उह, एक bezier वक्र दिया मैं कहूंगा कि यह नियंत्रण बिंदुओं की संख्या तक है।
अगर वहाँ तीन हैं, (शुरुआत, 'नियंत्रण' और अंत) मैं किसी प्रकार का स्कैन करूँगा (प्रत्येक जोड़े को प्रतिशत कहूँगा और फिर निकटतम लोगों के बीच परिशोधित करूँगा ('बाइनरी' दृष्टिकोण के साथ)।
अधिक अंक मैं उस जोड़े को आज़माऊंगा जो (Y- एक्सिस अनुवादित) के सबसे करीब थे।
मुझे यकीन है कि एक गणित-व्यक्ति आपको सटीक समाधान दे सकता है (गणित में) लेकिन अगर आप / वीडियो गेम में एक समाधान ढूंढना चाहते हैं तो आप थोड़े ठीक समाधान के साथ बेहतर हो सकते हैं क्योंकि वास्तविक समाधान में कई उत्तर हो सकते हैं ( मैं प्रसंस्करण शक्ति के बारे में भी बात नहीं कर रहा हूं)।
अल्गोरिथमिस्ट ब्लॉग पेज से कुछ उत्तर , जो दिए गए द्विघात बेज़ियर वक्र पर निकटतम बिंदु को सही ढंग से ढूंढता है।
डेमो ।
बेजियर वक्र - सीधी रेखा के मामले में, उत्तर खोजने का सबसे सटीक तरीका निम्नलिखित है: