सर्कल के लिए निकटतम सर्वश्रेष्ठ फिट का पता लगाएं


12

नीचे एक उदाहरण छवि है, अगर मेरे पास बीच में सफेद बिंदु का बिंदु है और मैं नीले सर्कल के लिए निकटतम संभावित स्थान ढूंढना चाहता हूं (जो स्पष्ट रूप से उस स्थान पर है जहां मैंने इसे रखा था) यदि सभी लाल वृत्त पहले से मौजूद हैं । मुझे वह स्थान कैसे मिल सकता है?

मेरे लिए प्रदर्शन इस आवेदन के लिए एक बड़ी चिंता का विषय नहीं है।

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


1
काले घेरे का क्या महत्व है? क्या आप इसके ऊपर नीला वृत्त रख सकते हैं?
इवान

2
तो स्पष्ट होने के लिए आप उस स्थान को चाहते हैं जहां आप नीले वृत्त को रख सकते हैं जैसे कि यह सफेद बिंदु से किसी अन्य सर्कल को ओवरलैप किए बिना सबसे कम संभव दूरी है?
रॉबर्ट हार्वे


2
क्या सभी मंडलियां कम से कम एक स्थान पर हमेशा किसी अन्य सर्कल को छूएंगी?
रॉबर्ट हार्वे

3
संबंधित: stackoverflow.com/questions/10666116 और stackoverflow.com/questions/5509151 । इसके अलावा संभवतः प्रासंगिक: stackoverflow.com/a/19375601
रॉबर्ट हार्वे

जवाबों:


4

यह एक सामान्य समाधान नहीं है, क्योंकि कई स्थितियां थीं, यह सफेद बिंदु के साथ कम दूरी के साथ नीले वृत्त की स्थिति प्रदान नहीं करेगा। उदाहरण के लिए, यदि आपने 100 लाल गेंदों को एक साथ समूहीकृत किया है और सफेद डॉट लाल गेंदों के इस समूह से बहुत दूर है तो लाल गेंदों में से किसी का भी नीले वृत्त की स्थिति पर कोई प्रभाव नहीं पड़ेगा जो सिर्फ सफेद डॉट पर केंद्रित हो सकता है । न ही यह सभी गणना विवरण दिखाएगा। वैसे भी, कॉन्फ़िगरेशन के एक सबसेट के लिए, जहां समाधान (नीला वृत्त) दो लाल हलकों के लिए स्पर्शरेखा है, निम्नलिखित में काम करना चाहिए:
1) आर को नीले वृत्त की त्रिज्या होने दें
2) लाल हलकों के सभी जोड़े पर एक लूप बनाएं, हाँ मुझे पता है कि यह O (n2) है।
3) हलकों की प्रत्येक जोड़ी के लिए i, j (xi, yi) और (xj, yj) केंद्रों के साथ संबंधित त्रिज्या री और आरजे के साथ, हलकों की जोड़ी के बीच की दूरी के वर्ग की गणना करें

d_ij^2=(xi-xj)^2+(yi-yj)^2  

4) हलकों के सभी जोड़े रखें

dij^2<R^2

एक सूची में।

5) सूची को आगे बढ़ाएं, त्रिज्या R के हलकों के 2 हलों को I और j दोनों हलकों में खोजे। ऐसा करने के लिए इस छवि के साथ इन समीकरणों का उपयोग करें लाल घेरे की एक जोड़ी के लिए दो नीले वृत्त कैंडिटेट्स

a = R+ri  
b = R+rj  
c = dij  
α = arccos((b^2+c^2-a^2)/(2bc)  

उपरोक्त जानकारी के साथ आप (X1ij, Y1ij) और (X2ij, Y2ij) 2 सर्कल के केंद्रों को हलकों में i और j में जोड़ सकते हैं। प्रत्येक उम्मीदवार के लिए सभी अन्य लाल हलकों पर नीले रंग का सर्कल लूप और देखें कि क्या यह ओवरलैप नहीं है। यदि वे इसे सफ़ेद चक्र की दूरी की जाँच नहीं करते हैं। यदि आप छोटी दूरी के साथ एक रखते हैं तो मुझे लगता है कि आपके पास हलकों के जोड़े की सूची को पार करते समय समाधान होगा। एल्गोरिथ्म O (n3) की तरह लगता है।


काम नहीं करता है जब केवल एक सर्कल है
इवान

या दो मंडलियां लेकिन उन दोनों के बाहर एक लक्ष्य बिंदु के साथ
इवान

समस्या यह है कि आप यह सुनिश्चित कर सकते हैं कि आपको सभी किनारे मामले मिल गए हैं
इवान

भी। उन मामलों के लिए अद्वितीय समाधान हैं
इवान

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

2

बिंदु पर निकटतम प्लेसमेंट या तो बिंदु पर होगा, या एक सर्कल को छूएगा।

इसलिए, पहले बिंदु की जांच करें, फिर प्रत्येक मौजूदा सर्कल के किनारे के चारों ओर नए सर्कल को रोल करें, बिंदु से दूरी की गणना करें और यदि आप जाते हैं और आप न्यूनतम दूरी बिंदु का ट्रैक रखते हुए ओवरलैप करते हैं। तब रुकें जब आपने हर वृत्त का पता लगाया हो।

अर्थात। हरे रंग की रेखाओं पर सभी बिंदुओं की जांच करें, साथ ही सफेद सर्कल। जहां हरी रेखा लाल और नीले रंग की त्रिज्या के साथ एक चक्र है

संभव केंद्र बिंदु

आपको पूरी तरह से ग्रीन लाइन की जांच करने की आवश्यकता है, न कि केवल चौराहों ताकि आप इन किनारे के मामलों को कवर करें।

एकल सर्कल के मामले

जाहिर है कि प्रदर्शन के मामले में आपके ट्रैवर्सल का चरण आकार महत्वपूर्ण होने वाला है। लेकिन जैसा कि आप कहते हैं कि राज्य का प्रदर्शन कोई समस्या नहीं है, अपने आउटपुट मूल्य के संकल्प के अनुरूप मूल्य चुनें। यानी फ्लोट, लंबे?

स्पष्टीकरण:

मेरा सुझाव प्रत्येक बिंदु पर अन्य सभी मंडलियों के साथ ओवरलैप के लिए प्रत्येक सर्कल परीक्षण के आसपास सभी बिंदुओं को बल देना है। कोई चालाकी नहीं।

यदि उदाहरण पिक सर्कल और रिज़ॉल्यूशन की संख्या का संकेत है, तो यह मानक पीसी के लिए समस्या नहीं होनी चाहिए

हमारे पास औसत त्रिज्या 200 के 20 वृत्त हैं, इसलिए लगभग 20 * 2 points * 200 अंक * 20 प्रतिच्छेदन परीक्षण = 4800000 पुनरावृत्तियों

ध्यान दें:

इस तरह के निष्क्रिय दृष्टिकोण आपके चरण आकार में त्रुटिपूर्ण हैं, इस मामले में आपके आउटपुट का रिज़ॉल्यूशन, परिणाम को बहुत प्रभावित कर सकता है।

मान लें कि मेरे पास दो लाल वृत्त हैं और उनके बीच निचोड़ने के लिए 1 पिक्सेल त्रिज्या नीला चक्र है। स्पष्ट रूप से नीले रंग के चक्र के केंद्र के रूप में दोनों में से किसी एक के साथ यह एक रेड को ओवरलैप करेगा। लेकिन स्पष्ट रूप से वृत्त के लिए जगह है अगर केंद्र दो पिक्सेल के बीच स्थित है।

इसलिए मेरी टिप्पणी आउटपुट के संकल्प के बारे में पूछ रही है। आपने कहा कि कुछ भी हो सकता है।

आप नीले वृत्त की त्रिज्या द्वारा त्रिज्या वृद्धि के साथ प्रत्येक जोड़ी हलकों के लिए एक साथ समीकरण भी हल कर सकते हैं।

यह आपको उन बिंदुओं को देगा जहां नीला वृत्त पुनरावृति की तुलना में दोनों लाल हलकों को अधिक सटीक रूप से स्पर्श करेगा।

हालाँकि। ऐसी कई स्थितियाँ हैं जहाँ यदि आप केवल ऐसा करते हैं तो आपको गलत या कोई उत्तर नहीं मिलता है। अर्थात।

1 या कोई मंडलियां नहीं

2 या अधिक मंडलियां लेकिन लक्ष्य बिंदु दूर और उनके बाहर हैं।

कई वृत्त लेकिन सतह के करीब लक्ष्य बिंदु के साथ


2
कि उसे दूसरे सर्कल के बाहर नीले सर्कल के किनारे को रोल करने की आवश्यकता है, यह पता लगाने का आसान हिस्सा है। कठिन भाग इसे करने के लिए समीकरणों / गणनाओं का पता लगा रहा है।
रॉबर्ट हार्वे

1
वास्तव में? इसका औचित्य (x-X1) ^ 2 + (y-y1) ^ 2 = (r + r1) ^ 2
Ewan

2
और फिर आपको वह सब करना होगा जब आप अगले बिंदु पर कोशिश करेंगे। मुझे पता है कि ओपी ने कहा कि प्रदर्शन चिंता का विषय नहीं था, लेकिन इसे ब्रह्मांड की गर्मी से पहले पूरा करना होगा।
रॉबर्ट हार्वे

2
यह जानने का एकमात्र तरीका है कि आपको दस अपवॉट्स मिलेंगे या नहीं, अपने सी # कोड को पोस्ट करें और देखें कि क्या होता है।
रॉबर्ट हार्वे

2
मुझे लगता है कि क्या होगा ओपी इसे अपने होमवर्क के जवाब के रूप में कोड करेगा और हम उसे फिर से कभी नहीं सुनेंगे
इवान

1

इस प्लंक में वर्किंग कोड होता है,

संकल्पना

दिए गए सर्कल C1, C2 .... Cn हैं

और सर्कल Cn का निर्देशांक Cnx है, Cny और त्रिज्या Cr है

और आवश्यक सर्कल का त्रिज्या R है

यदि नीला वृत्त X, Y स्थान पर है और यदि यह किसी अन्य वृत्त के साथ टकराव नहीं करता है, तो निम्नलिखित समीकरण सत्य हैं

(C1x - X)^2 + (C1y - Y)^2 > (C1r + R)^2
(C2x - X)^2 + (C2y - Y)^2 > (C2r + R)^2
....
(Cnx - X)^2 + (Cny - Y)^2 > (Cnr + R)^2

पहला समीकरण बदलना,

C1x^2 - 2C1x*X + X^2 + C1y^2 - 2C1y*Y + Y^2 > C1r^2 + 2C1r*R + R^2
X^2 + Y^2 - 2C1x*X - 2C1y*Y > C1r^2 + 2C1r*R + R^2 - C1x^2 - C1y^2

इसलिए समीकरण फिर से लिख सकते हैं,

X^2 + Y^2 - 2C1x*X - 2C1y*Y > C1r^2 + 2C1r*R + R^2 - C1x^2 - C1y^2
X^2 + Y^2 - 2C2x*X - 2C2y*Y > C2r^2 + 2C2r*R + R^2 - C2x^2 - C2y^2
....
X^2 + Y^2 - 2Cnx*X - 2Cny*Y > Cnr^2 + 2Cnr*R + R^2 - Cnx^2 - Cny^2

कार्यान्वयन

सफेद बिंदु (Xw, Yw) के समन्वय से शुरू करें,

    var isValidLocation = function(x,y,r){
       var valid = true;
       for (var i = 0; i< circles.length; i++){
          var circle = circles[i];
          valid = valid && ((x*x + y*y - 2*circle.x*x - 2*circle.y*y) > (circle.radius*circle.radius + 2*circle.radius*r + r*r - circle.x*circle.x - circle.y*circle.y));
       }
       return valid;
      };

      var find = function(Xw,Yw,Rw){
        var radius = 0;
        while(true){
          for (var x=-1 * radius ;x <= radius; x++) {
            for (var y=-1 * radius;y <= radius; y++) {
               if (isValidLocation(Xw + x,Yw + y, Rw)){
                 drawCircle(Xw + x,Yw + y,Rw,"#0000FF");
                 return;
               }
            }   
          } 
          radius++;
        }
     }; 

सभी समीकरणों को पूरा करने के लिए पाया गया पहला समन्वय नीले घेरे का स्थान है


क्या कोई समझा सकता है कि इस दृष्टिकोण में क्या गलत है?
लो फ्लाइंग पेलिकन

यह पढ़ना मुश्किल है। कुछ अच्छे नामों और सार का उपयोग करें। क्या यह आपको आरेख जोड़ने के लिए मार देगा?
कैंडिड_ओरेंज

जहां तक ​​मैं देख सकता हूं, यह दृष्टिकोण नीले सर्कल के लिए केवल मान्य प्लेसमेंट खोजने का प्रयास करता है, लेकिन निकटतम संभव स्थान नहीं। यह तय किया जा सकता है, हालांकि, दृष्टिकोण भी (शायद सबसे अमान्य) धारणा बनाता है कि पूर्णांक मान निर्देशांक की एक सीमित संख्या है।
डॉक्टर ब्राउन

यह सफेद बिंदु के समन्वय से शुरू होता है, और इसके चारों ओर खोज ग्रिड का विस्तार करता है। इसकी वजह से उसे ऐसी किसी भी स्थिति का सामना नहीं करना पड़ेगा जहाँ उसके पास अनंत संख्या में निर्देशांक हैं .. आखिरकार उसे मिलान समन्वय मिलेगा।
लो फ्लाइंग पेलिकन

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

0
  • बिंदु है कि आप के करीब होने की कोशिश कर रहे हैं
  • P वह बिंदु है जिसकी आपको तलाश है (नीले घेरे का केंद्र)
  • r नीले वृत्त की त्रिज्या है
  • C0 .. उन सभी सर्किलों के केंद्र होने के नाते जो नीले रंग के प्लेसमेंट को प्रतिबंधित करते हैं
  • विस्तारित सर्कल r के द्वारा विस्तारित त्रिज्या के साथ सर्कल में से एक है

    O कुछ सर्कल सेंटर में नहीं है, तो कुछ अतिरिक्त काम है। तो अभी ओ == C0 मान लें

C0 के साथ सभी हलकों के सभी चौराहों की गणना करें , उनके संबंधित त्रिज्या प्लस r का उपयोग करके , विस्तारित C0 के साथ विस्तारित मंडलियों को प्रतिच्छेद करें। यदि कोई चौराहे नहीं हैं, तो आप जिस बिंदु की तलाश कर रहे हैं, वह C0 पर कहीं भी है, यदि कोई चौराहा है, तो प्रत्येक चौराहे की जांच करें कि क्या वह किसी अन्य विस्तारित सर्कल के अंदर है (आप अपने आप को उन मंडलों तक सीमित कर सकते हैं जिनके पास C0 के साथ चौराहे थे)। पहला चौराहा लें जो P के रूप में एक और विस्तारित सर्कल में नहीं है, अन्य हो सकते हैं।

यदि विस्तारित सर्कल और C0 के बीच कोई चौराहे नहीं हैं जो एक और विस्तारित सर्कल के अंदर नहीं हैं, तो एक दूसरे के साथ सभी विस्तारित सर्कल के चौराहों की गणना करें। फिर O के लिए दूरी के क्रम में इन चौराहों की जाँच करें, फिर से किसी भी चौराहे पर एक और विस्तारित चक्र के भीतर झूठ बोलना चाहिए, यदि हाँ, तो त्यागें, यदि कोई परिणाम नहीं है तो।

यदि आप यह कल्पना करते हैं कि सभी मंडलियों के चारों ओर एक रेखा खींचने की कल्पना करें जो आपके नीले वृत्त के लिए एक संभावित स्थान को इंगित करता है, तो सभी विस्तारित मंडलियों का संघ लेना उस क्षेत्र को इंगित करेगा जो आपका नीला वृत्त नहीं हो सकता है। आप जिस बिंदु की तलाश कर रहे हैं, वह निकटतम बिंदु है जो उस संघ में नहीं है। यदि C0 पर कोई बिंदु है जो उस संघ में नहीं है जो कि समाधान है, यदि C0 पूरी तरह से कवर किया गया है, तो P को दो अन्य विस्तारित हलकों के बीच एक चौराहे पर होना है, और इसे एक ऐसे क्षेत्र में होना है जो इसके द्वारा कवर नहीं है इस संघ (यानी एक विस्तारित सर्कल में नहीं )।

यह O (n ^ 2) है, इसे सुधारने के कुछ तरीके हैं, हालांकि, जोड़ीदार खोज के प्रयास को कम करने के लिए एक ग्रिड का उपयोग किया जा सकता है, मुझे भी लगता है कि उनकी घेरेबंदी को O से घेर कर हल किया जा सकता है, (बीच की दूरी रेडियो द्वारा कम किए गए दो घेरे) कवरेज और चौराहे की खोज के लिए खोज स्थान को सीमित करने में मदद करेंगे


0

संभव समाधान खोज

  1. जांच लें कि क्या सफेद बिंदु खुद से समाधान है। यह 0 लाल हलकों और तुच्छ मामले के मामले को कवर करता है जब लाल वृत्त सफेद बिंदु से बहुत दूर होते हैं।
  2. एक लाल घेरा।
    1. सफेद बिंदु वृत्त का केंद्र है। संभव समाधान सफेद बिंदु और त्रिज्या में नीले वृत्त की त्रिज्या और लाल वृत्त व्यास के केंद्र के साथ वृत्त पर अनंत संख्या के बिंदु हैं। चलो इसे ग्रीन सर्कल कहते हैं
    2. सफेद बिंदु कहीं और है। लाइन पर केवल एक ही संभव समाधान है जो लाल बिंदु के सफेद बिंदु और केंद्र को जोड़ता है, यह उस बिंदु से दूर नीले वृत्त की त्रिज्या है जहां लाल वृत्त सफेद बिंदु की ओर रेखा को पार करता है।
  3. दो या अधिक लाल घेरे।
    1. आइए एक-एक करके लाल हलकों को लें और बिंदु 2 (एक सर्कल) के अनुसार व्यक्तिगत रूप से उनमें से प्रत्येक के लिए संभव समाधान देखें
    2. लाल हलकों के प्रत्येक जोड़े के लिए आइए जाँच करें कि क्या आप लाल वृत्त को लाल रंग के दोनों को छू सकते हैं। यानी, अगर उनके केंद्रों के बीच की दूरी नीले वृत्त के उनके त्रिज्या के व्यास के बराबर या उससे कम है। यदि आप कर सकते हैं तो आपके पास दो (या एक हो सकता है अगर लाल वृत्त ठीक एक नीले वृत्त व्यास दूर हैं) संभव समाधान

संभावित समाधानों के बीच वास्तविक समाधान की खोज

अब आपके पास बिंदुओं का एक सेट है जो संभव समाधान हैं , उनके माध्यम से पुनरावृत्त करें और प्रत्येक के लिए जांचें।

  1. अगर बिंदु वास्तव में एक समाधान है। किसी भी रेड सर्कल का केंद्र उसके त्रिज्या से इस बिंदु के करीब नहीं होना चाहिए।
  2. यदि यह पहले पाए गए समाधान की तुलना में सफेद बिंदु के करीब है।
  3. यदि आपके पास हरा वृत्त है (बिंदु 2.1)
    • यदि व्यक्तिगत बिंदुओं के बीच कोई समाधान नहीं है जो कि हरे रंग के चक्र से संबंधित है तो हरे रंग का चक्र उत्तर है।
    • यदि आपके पास हरे घेरे पर अलग-अलग समाधान हैं और आपको बस किसी भी समाधान की आवश्यकता है तो बस उनमें से एक को लें।
    • यदि आपके पास हरे घेरे पर अलग-अलग समाधान हैं और आपको सभी असीमित संख्या में समाधान की आवश्यकता है, तो आपको एक और समस्या को हल करने की आवश्यकता है। आपको हरे रंग के सर्कल से कटौती करने की आवश्यकता है प्रत्येक लाल सर्कल से व्यक्तिगत समाधानों की जोड़ी द्वारा परिभाषित सभी आर्क्स।

NB: मैं यह नहीं कह रहा हूं कि एल्गोरिथ्म का कार्यान्वयन बिल्कुल वर्णित होना चाहिए। आप गतिशील प्रोग्रामिंग या संभव समाधानों को छोड़ कर प्रदर्शन को बेहतर बनाने का प्रयास कर सकते हैं जहां यह स्पष्ट है कि वे काम नहीं करेंगे।

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