आप 2 घटता पर निकटतम बिंदु की गणना कैसे करते हैं?


15

एक पंक्ति और एक द्विघात वक्र के बिंदुओं को देखते हुए, आप उनके निकटतम बिंदु की गणना कैसे करते हैं? .... इसी तरह, 2 घटों के बिंदु को देखते हुए, आप निकटतम बिंदु कैसे प्राप्त करते हैं?

यहाँ छवि विवरण दर्ज करें


2
मेरा मानना ​​है कि यह सवाल एक अच्छी शुरुआत है।
सैम होसेवर

जवाबों:


3

यहाँ मेरी कोशिश है। निम्नलिखित एल्गोरिदम परिपूर्ण से बहुत दूर हैं , लेकिन वे सरल हैं और मेरा मानना ​​है कि आपको इसके साथ शुरू करना चाहिए, जांचें कि क्या वे आपकी स्थिति में काम करते हैं, और बाद में कुछ और / या अधिक सटीक स्विच करते हैं।

विचार निम्नलिखित है:

  • बेज़ियर वक्र का नमूना लें, उस नमूने पर निकटतम बिंदु खोजें
  • पाया बिंदु के आसपास एक पड़ोस का नमूना लें, एक नया निकटतम बिंदु ढूंढें
  • तब तक जारी रखें जब तक कि बिंदु बहुत अधिक न बदल जाए

Bézier वक्र से लाइन की दूरी के लिए एल्गोरिदम

बेज़ियर वक्र F(t)नियंत्रण बिंदुओं के एक सेट और एक अलग पैरामीटर का उपयोग करके एक फ़ंक्शन द्वारा पैरामीट्राइज़ किया जाता है t। उत्पादक बिंदुओं की संख्या महत्वहीन है।

लाइन दो अंकों से parametrised है Aऔर B

  1. SAMPLES = 10उदाहरण के लिए दें

  2. के साथ शुरू करो t0 = 0औरt1 = 1

  3. चलो dt = (t1 - t0) / SAMPLES

  4. यदि dt < 1e-10(या किसी अन्य सटीकता की स्थिति जिसे आप फिट देखते हैं), एल्गोरिथ्म समाप्त हो गया है और उत्तर हैF(t0)

  5. SAMPLES + 1Bézier वक्र पर बिंदुओं की एक सूची की गणना करें :

    • L[0] = F(t0)
    • L[1] = F(t0 + dt)
    • L[2] = F(t0 + 2 * dt)
    • ...
    • L[SAMPLES] = F(t0 + SAMPLES * dt)
  6. पता लगाएं कि Lसूचकांक के साथ कौन सा बिंदु iरेखा के सबसे करीब है। आपके द्वारा ज्ञात किसी भी बिंदु / रेखा दूरी विधि का उपयोग करें , उदाहरण के लिए वर्ग दूरी ||AB^L[i]A||² / ||AB||²जहां ^क्रॉस उत्पाद को दर्शाता ||…||है और दूरी है।

  7. अगर i == 0, सेट i = 1; अगर i == SAMPLES, सेटi = SAMPLES - 1

  8. चलो t1 = t0 + (i + 1) * dtऔरt0 = t0 + (i - 1) * dt

  9. चरण 3 पर वापस जाएं।

Bézier वक्र से Bézier वक्र की दूरी के लिए एल्गोरिदम

इस बार हमारे पास दो बेज़ियर कर्व्स हैं, जिनके द्वारा पैराट्राइज़्ड F(t)और G(t)

  1. SAMPLES = 10उदाहरण के लिए दें

  2. के साथ शुरू करो t0 = 0, t1 = 1, s0 = 0औरs1 = 1

  3. चलो dt = (t1 - t0) / SAMPLES

  4. चलो ds = (s1 - s0) / SAMPLES

  5. यदि dt < 1e-10(या किसी अन्य सटीकता की स्थिति जिसे आप फिट देखते हैं), एल्गोरिथ्म समाप्त हो गया है और उत्तर हैF(t0)

  6. यदि यह लूप का पहला रन है:

    6.1। SAMPLES + 1बिंदुओं की एक सूची की गणना करें F( ऊपर देखें )।

    6.2। SAMPLES + 1बिंदुओं की एक सूची की गणना करें G

    6.3। जानें कि कौन से बिंदु एक दूसरे के सबसे करीब हैं।

    6.4। अद्यतन t0, t1, s0, s1ऊपर देखा के रूप में।

  7. ELSE : वैकल्पिक रूप से F या बिंदुओं की एक सूची पर बिंदुओं की एक सूची की गणना करते हैं G, फिर पाते हैं कि कौन सा बिंदु Fनिकटतम है G(s0)और अपडेट करें t0और t1, या किस बिंदु के Gसबसे करीब है F(t0)और अपडेट करें s0और s1

  8. चरण 3 पर वापस जाएं।

मुद्दे

डिजाइन द्वारा, ये एल्गोरिदम हमेशा एक स्थानीय न्यूनतम में परिवर्तित होंगे। हालांकि, इस बात की कोई गारंटी नहीं है कि वे सबसे अच्छे समाधान के लिए अभिसरित होंगे। विशेष रूप से, Bézier कर्व एल्गोरिथ्म बहुत अच्छा नहीं है, और दो घटता एक दूसरे के करीब कई स्थानों पर होने के मामले में आप दुर्भाग्य से एक लंबे शॉट द्वारा समाधान याद कर सकते हैं।

लेकिन जैसा कि मैंने कहा, इससे पहले कि आप अधिक मजबूत समाधानों के बारे में सोचना शुरू करें, आपको पहले उन सरल लोगों के साथ प्रयोग करना चाहिए।


0

1) सब कुछ एक अक्ष पर अनुवाद करें, इसलिए एक बिंदु की लंबाई की गणना करने के बजाय, 'लाइन', 'लाइन', का कहना है, वाई-एक्सिस।

फिर, उह, एक bezier वक्र दिया मैं कहूंगा कि यह नियंत्रण बिंदुओं की संख्या तक है।

अगर वहाँ तीन हैं, (शुरुआत, 'नियंत्रण' और अंत) मैं किसी प्रकार का स्कैन करूँगा (प्रत्येक जोड़े को प्रतिशत कहूँगा और फिर निकटतम लोगों के बीच परिशोधित करूँगा ('बाइनरी' दृष्टिकोण के साथ)।

अधिक अंक मैं उस जोड़े को आज़माऊंगा जो (Y- एक्सिस अनुवादित) के सबसे करीब थे।

मुझे यकीन है कि एक गणित-व्यक्ति आपको सटीक समाधान दे सकता है (गणित में) लेकिन अगर आप / वीडियो गेम में एक समाधान ढूंढना चाहते हैं तो आप थोड़े ठीक समाधान के साथ बेहतर हो सकते हैं क्योंकि वास्तविक समाधान में कई उत्तर हो सकते हैं ( मैं प्रसंस्करण शक्ति के बारे में भी बात नहीं कर रहा हूं)।


ps। 2 घटता है, इसके बारे में भी मत सोचो (आप नियंत्रण बिंदुओं की संख्या के अनुसार कुछ भी प्राप्त कर सकते हैं (कम से कम जैसा हो सकता है ..)
वालमैंड

0

अल्गोरिथमिस्ट ब्लॉग पेज से कुछ उत्तर , जो दिए गए द्विघात बेज़ियर वक्र पर निकटतम बिंदु को सही ढंग से ढूंढता है।

डेमो

यहाँ छवि विवरण दर्ज करें


हां, अच्छा डेमो। जवाब कहां है?
एको

1
: मैं वह प्रदर्शन के स्रोत को देखने के लिए हमें चाहता था लगता है algorithmist.net/DegrafaClosestToQuad/srcview/index.html
Mutoh

0

बेजियर वक्र - सीधी रेखा के मामले में, उत्तर खोजने का सबसे सटीक तरीका निम्नलिखित है:

  1. समस्या को रूपांतरित करें ताकि सीधी रेखा हमेशा Y = 0 पर क्षैतिज हो। यह एक उपयुक्त एफ़िन मैट्रिक्स द्वारा सभी नियंत्रण बिंदुओं को गुणा करके किया जाता है। (मुझे लगता है कि आप 3 फिक्स्ड प्रविष्टियों के साथ 3x3 मैट्रिस के साथ विमान के चक्कर परिवर्तनों का प्रतिनिधित्व करने से परिचित हैं।)
  2. नियंत्रण बिंदुओं के Y निर्देशांक का निरीक्षण करें। यदि वे सभी समान चिन्ह नहीं रखते हैं, तो रेखा के साथ एक चौराहा हो सकता है। बेज़ियर वक्र के Y भाग की जड़ों की गणना करें। आप बहुपद के लिए किसी भी मूल खोज विधि का उपयोग कर सकते हैं, साहित्य में उनमें से बहुत सारे हैं। उदाहरण के लिए, Google "उत्तल पतवार मार्चिंग" - यह बेजान घटता में इस्तेमाल किए जाने वाले बहुपदों के लिए एक उचित अच्छी विधि है। आपके द्वारा पाया गया प्रत्येक रूट लाइन के साथ एक चौराहे का समय मान है, जहां दूरी शून्य है - आपका काम पूरा हो गया है।
  3. यदि सभी वाई कोर्ड्स पर एक ही चिन्ह है, तो बेज़ियर वक्र के Y भाग के व्युत्पन्न की गणना करें। आप बिंदुओं के एक्स निर्देशांक को अनदेखा कर सकते हैं, क्योंकि उन्हें कोई फर्क नहीं पड़ता है - लक्ष्य रेखा क्षैतिज है। उस व्युत्पन्न की जड़ों का पता लगाएं। ये समय मान हैं जिस पर वक्र स्थानीय रूप से रेखा के सबसे करीब है।
  4. स्पष्ट रूप से उन सभी जड़ों के लिए बेज़ियर वक्र का मूल्यांकन करें जो आपने पिछले चरण में पाया है और उस रूट की रिपोर्ट करें जो लाइन से सबसे छोटी दूरी देता है। आपको समापन बिंदुओं की जांच करने की भी आवश्यकता है - वे किसी भी रूट की तुलना में थोड़ी दूरी दे सकते हैं।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.