अतिव्यापी हलकों का संयुक्त क्षेत्र


107

मुझे हाल ही में एक समस्या आई, जहां मेरे पास चार सर्कल (मिडपॉइंट और त्रिज्या) थे और इन सर्कल के संघ के क्षेत्र की गणना करना था।

उदाहरण छवि:

दो हलकों के लिए यह काफी आसान है,

मैं सिर्फ प्रत्येक वृत्त क्षेत्र के अंश की गणना कर सकता हूं जो त्रिकोण के भीतर नहीं है और फिर त्रिकोण के क्षेत्र की गणना करता है।

लेकिन क्या एक चतुर एल्गोरिथ्म है जिसका मैं उपयोग कर सकता हूं जब दो से अधिक मंडलियां हों?


15
यह वास्तव में एक दिलचस्प समस्या है, मुझे याद है कि यह हाई स्कूल की ज्यामिति कक्षा में है, लेकिन इसका समाधान कभी नहीं मिला। अगर आपको यहां कोई उत्तर नहीं मिल रहा है, तो इसे mathoverflow.net पर पोस्ट करने का प्रयास करें और गणितज्ञों को इस पर एक दरार दें: P
चार्ल्स Ma

25
कभी कभी असली प्रोग्रामर असली गणित की जरूरत है
पिता।

1
इस सवाल का जवाब देने के बारे में कैसे - "हमारे पास इन 4 स्थानों पर रहने वाले बिक्री प्रतिनिधि हैं, जिनमें से प्रत्येक इन 4 राडियों के साथ एक क्षेत्र की सेवा करते हैं। हम देश को कितना कवर करते हैं?" यदि आपके पास बिक्री प्रतिनिधि का बदलता डेटाबेस था, तो यह एक प्रोग्रामिंग प्रश्न बन जाता है!
क्रिस रॉबर्ट्स

5
वास्तव में, इस तरह की समस्या वास्तविक प्रोग्रामर के बारे में सोचना पसंद है।
मैक

2
@zvolkov: सर्किट बोर्ड को एक ऐसी भाषा के साथ वर्णित किया गया है जो चौकों और हलकों को बंद कर देता है और वैकल्पिक रूप से उन्हें खींचता है। "तांबे के क्षेत्र की गणना करें"। (यह समय की गणना करने के लिए आवश्यक हो सकता है, पता है कि मैला ढोने की कलाकृति, विभिन्न चीजों को जोड़ना है।)
डिजिटलरोस

जवाबों:


97

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

सर्कल ओवरलैप


17
जब केंद्र में कोई छेद होता है तो क्या होता है?
जॉन गिज़ेन 14

3
आपको छेद से केंद्र से जुड़े बहुभुज को कुल से घटाना होगा और उस बहुभुज के लिए वृत्त के स्लाइस को जोड़ना होगा।
चींटियों का प्लाज्मा

3
अच्छा है, लेकिन मुझे लगता है कि सभी विशेष मामलों को संभालने के लिए बहुत सारे कार्यान्वयन विवरणों की आवश्यकता होगी (एक दूसरे के अंदर सर्कल, कोई चौराहा, छेद, एक बिंदु संपर्क ...)
एफए।

1
विशेष मामले बहुत आसान हैं। परिधि चौराहों के न होने से दूसरों के अंदर के चक्रों को छोड़ दिया जाता है। एक बिंदु संपर्क शून्य दूरी के साथ दो चौराहों पर होता है। केंद्रों की दूरी रेडी के योग से कम होने पर ग्राफ के ऊपर जुड़े हुए कलन विधि एल्गोरिथ्म के माध्यम से असंबद्ध आकृतियों को पाया जा सकता है। छेद सबसे बड़े क्षेत्र के अलावा सभी बहुभुज हैं। परिधि चौराहे सभी चौराहे हैं जो किसी भी सर्कल के अंदर कड़ाई से नहीं हैं।
चींटियों का प्लाज्मा

4
हां, लेकिन छिद्रों की सीमाएं (छोटी) आर्क भी हैं। मुझे अभी भी लगता है कि इसे अच्छी तरह से काम करने के लिए बहुत सारे कोड की आवश्यकता है।
पिता।

32

मुझे यकीन है कि एक चतुर एल्गोरिदम है, लेकिन यहां एक गूंगा है जो इसे देखने के लिए बचा सकता है;

  • मंडलियों के चारों ओर एक बाउंडिंग बॉक्स रखें;
  • बाउंडिंग बॉक्स के भीतर यादृच्छिक अंक उत्पन्न करना;
  • पता लगाएँ कि क्या यादृच्छिक बिंदु मंडलियों में से एक के अंदर है;
  • कुछ सरल जोड़ और विभाजन के अनुपात से क्षेत्र की गणना करें (ratio_of_point_inside * area_of_bounding_box)।

यकीन है कि यह गूंगा है, लेकिन:

  • आप जितना चाहें उतना सटीक उत्तर प्राप्त कर सकते हैं, बस अधिक अंक उत्पन्न कर सकते हैं;
  • यह किसी भी आकार के लिए काम करेगा जिसके लिए आप अंदर / बाहर भेद की गणना कर सकते हैं;
  • यह खूबसूरती से समानांतर होगा ताकि आप अपने सभी कोर का उपयोग कर सकें।

2
यह काम करेगा, लेकिन इस तरह के मोंटे-कार्लो तरीके, समान रूप से समान नमूनाकरण पर आधारित हैं, आमतौर पर सबसे अच्छा अभिसरण दर नहीं है।
श्रीवत्सआर

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

5
आप सही कह रहे हैं, मुझे खुद पर शर्म आ रही है, लेकिन मुझे 12,000 कोर के साथ एक क्लस्टर मिला है, मैं भव्य होना बर्दाश्त कर सकता हूं। और मैं यह पता नहीं लगा सकता कि कैसे कई प्रोसेसर के लिए सुरुचिपूर्ण गणितीय समाधान पैमाना बनाया जाए।
उच्च प्रदर्शन मार्क

8
मोंटे-कार्लो (या किसी भी यादृच्छिक) दृष्टिकोण के साथ स्वाभाविक रूप से कुछ भी गलत नहीं है, बशर्ते यह सटीकता की आवश्यक डिग्री देता है और उचित समय में ऐसा करता है।
मैक

@ mafutrct, आप निश्चित रूप से सही हैं। हालाँकि, गणित में थोड़ी गलतियाँ करना आसान है। यह समाधान शुद्धता का परीक्षण करने का एक सरल तरीका प्रदान करता है।
रिचर्ड

18

चींटियों के प्लाज्मा के जवाब ने मूल विचार दिया, लेकिन मैं इसे थोड़ा और ठोस बनाना चाहता था। नीचे दिए गए पाँच वृत्तों पर एक नज़र डालें और जिस तरह से वे विघटित हुए हैं।

उदाहरण

  • नीले बिंदु वृत्त केंद्र हैं।
  • लाल डॉट्स सर्कल बाउंड्री चौराहे हैं।
  • सफेद इंटीरियर के साथ लाल डॉट्स सर्कल बाउंडरी चौराहे हैं जो किसी अन्य सर्कल में निहित नहीं हैं ।

इन 3 प्रकार के डॉट्स को पहचानना आसान है। अब एक ग्राफ डेटा संरचना का निर्माण करें जहां नोड्स नीले डॉट्स और सफेद इंटीरियर के साथ लाल डॉट्स हैं। प्रत्येक सर्कल के लिए, अपनी सीमा पर सर्कल मिडिल (ब्लू डॉट) और इसके प्रत्येक चौराहों (सफेद इंटीरियर के साथ लाल डॉट्स) के बीच एक किनारे रखें।

यह सर्कल यूनियन को पॉलीगॉन (छायांकित नीला) और गोलाकार पाई के टुकड़ों (शेडेड ग्रीन) के एक समूह में विभाजित करता है, जो जोड़ीदार तिरस्कार होते हैं और मूल संघ (यानी एक विभाजन) को कवर करते हैं। चूँकि यहाँ प्रत्येक टुकड़ा कुछ ऐसा है, जिसके क्षेत्र की गणना करना आसान है, आप टुकड़ों के क्षेत्रों को जोड़कर संघ के क्षेत्र की गणना कर सकते हैं।


मुझे लगता है कि मैं काफी आसानी से लाल / सफेद डॉट्स के एक सेट की गणना कर सकता हूं, लेकिन मेरा ग्राफ सिद्धांत बहुत अच्छा नहीं है: एल्गोरिदमिक रूप से, आप एक गणना क्षेत्र में नोड्स + किनारों की सूची से कैसे प्राप्त करेंगे?
user999305

1
बहुभुज के बजाय गैर अतिव्यापी त्रिकोण के एक सेट का उपयोग करके एल्गोरिथ्म को सरल बनाया जा सकता है। आर्क्स (हरा क्षेत्र) केवल एक सर्कल में निहित क्षेत्र हैं। बहुभुज के आकार को बढ़ाएं क्योंकि आप अधिक मंडलियां जोड़ते हैं। (अंत में आप भूल सकते हैं कि आप बहुभुज के बारे में भी बात कर रहे हैं)। यह बूलियन गुण बनाता है और क्षेत्रों को भी गणना करना आसान होता है। एक खोखले लाल बिंदु के रूप में एक ठोस लाल बिंदु बन जाता है, आप बस अपने सेट में अधिक त्रिभुज जोड़ते हैं, और आप चाप को समायोजित करते हैं जो अधिक से अधिक अन्तर्विभाजक मंडलियों द्वारा "दूर खाया" जाता है।
स्टीव

16

पिछले एक से एक अलग समाधान के लिए आप एक क्वाडट्री का उपयोग करके मनमानी परिशुद्धता के साथ एक अनुमान लगा सकते हैं।

यह किसी भी आकार के संघ के लिए भी काम करता है यदि आप बता सकते हैं कि कोई वर्ग अंदर या बाहर है या आकृति को काटता है।

प्रत्येक कोशिका में एक राज्य होता है: खाली, पूर्ण, आंशिक

एल्गोरिथ्म में क्वाडट्री में कम रिज़ॉल्यूशन के साथ शुरू होने वाले सर्कल को "ड्राइंग" में शामिल किया गया है (उदाहरण के लिए 4 सेल खाली के रूप में चिह्नित)। प्रत्येक कोशिका या तो है:

  • कम से कम एक सर्कल के अंदर, फिर सेल को पूर्ण के रूप में चिह्नित करें,
  • सभी मंडलियों के बाहर, सेल को रिक्त के रूप में चिह्नित करें,
  • सेल आंशिक के रूप में चिह्नित करें।

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

यदि त्रुटि आपके लिए बहुत बड़ी है, तो आप आंशिक कोशिकाओं को परिशोधित करते हैं जब तक कि आपको सही परिशुद्धता प्राप्त न हो।

मुझे लगता है कि यह ज्यामितीय विधि की तुलना में लागू करना आसान होगा, जिसमें बहुत सारे विशेष मामलों को संभालने की आवश्यकता हो सकती है।


3
मेरा अनुमान है कि यह मोंटे कार्लो के अंदर / बाहर बिंदु एल्गोरिथम की तुलना में अधिक तेजी से अभिसरण करेगा।
फ्रैंक क्रुएगर

यह लागू करने के लिए बहुत आसान लगता है। निश्चित रूप से सबसे अच्छा जानवर बल विधि का सुझाव दिया। धन्यवाद!
एंटोन हैनसन

जानवर यहाँ बल निचोड़ प्रमेय कहा जाता है
पिता।

इस तरह का एल्गोरिथ्म आप अंतराल अंकगणित में उपयोग करते हैं। en.wikipedia.org/wiki/Interval_arithmetic
rjmunro

13

मुझे 2 इंटरसेक्टिंग सर्कल के मामले में दृष्टिकोण पसंद है - यहां मैं और अधिक जटिल उदाहरण के लिए एक ही दृष्टिकोण के थोड़े बदलाव का उपयोग करूंगा।

यह अर्ध-अतिव्यापी हलकों की बड़ी संख्या के लिए एल्गोरिथ्म को सामान्य बनाने में बेहतर जानकारी दे सकता है।

यहां अंतर यह है कि मैं केंद्रों को जोड़ने से शुरू करता हूं (इसलिए उन स्थानों के बीच के बजाय मंडलियों के बीच एक वर्टीकल है, जहां मंडलियां इंटरसेक्ट करती हैं) मुझे लगता है कि यह इसे सामान्यीकृत करने देता है।

(व्यवहार में, शायद मोंटे-कार्लो विधि सार्थक है)

वैकल्पिक शब्द
(स्रोत: secretGeek.net )


1
मुझे लगता है कि आपकी छवि द्वारा सुझाए गए बहुभुज विभाजन को करना शायद बहुत अच्छा दृष्टिकोण होगा। इसे कोड करने के लिए बहुत सारे विवरण हैं। यह बीस मंडलियों की श्रृंखला को कैसे संभालेगा, जिनमें से प्रत्येक श्रृंखला में केवल अंतिम और अगले को ओवरलैप करता है? हाथ से पता लगाना आसान है, लेकिन आपका एल्गोरिथ्म क्या है?
पीटरअलेनवेब

4

यदि आप एक असतत (निरंतर के विपरीत) उत्तर चाहते हैं, तो आप पिक्सेल पेंटिंग एल्गोरिदम के समान कुछ कर सकते हैं।

एक ग्रिड पर हलकों को ड्रा करें, और फिर ग्रिड के प्रत्येक सेल को रंग दें यदि यह ज्यादातर एक सर्ल के भीतर निहित है (यानी, इसका कम से कम 50% क्षेत्र एक सर्कल के अंदर है)। पूरे ग्रिड के लिए ऐसा करें (जहां ग्रिड हलकों द्वारा कवर किए गए सभी क्षेत्रों में फैला हुआ है), फिर ग्रिड में रंगीन कोशिकाओं की संख्या की गणना करें।


3

हम्म, बहुत दिलचस्प समस्या। मेरा दृष्टिकोण संभवतः निम्नलिखित की तर्ज पर कुछ होगा:

  • कार्य करने का एक तरीका है कि एक सर्किल की संख्या के बीच के चौराहे के क्षेत्रों को निर्धारित करें, यानी यदि मेरे पास 3 सर्कल हैं, तो मुझे यह पता लगाने की आवश्यकता है कि उन मंडलियों के बीच का अंतर क्या है। "मोंटे-कार्लो" विधि इसे ( http://local.wasp.uwa.edu.au/~pbourke/geometry/circlearea/ ) का एक अच्छा तरीका होगा ।
  • किसी भी ऐसे सर्कल को हटा दें जो पूरी तरह से एक और बड़े सर्कल में समाहित है (त्रिज्या को देखें और दो सर्कल के बीच की दूरी के मापांक) मुझे नहीं लगता कि यह अनिवार्य है।
  • 2 मंडलियां चुनें (उन्हें A और B कॉल करें) और इस फॉर्मूले का उपयोग करके कुल क्षेत्रफल का काम करें:

(यह किसी भी आकार के लिए सही है, यह चक्र हो या अन्यथा)

area(A∪B) = area(A) + area(B) - area(A∩B)

जहां A ∪ Bए संघ बी का A ∩ Bमतलब है और ए इंटरसेक्ट बी (आप इसे पहले चरण से बाहर काम कर सकते हैं।

  • अब मंडलियों को जोड़ते रहें और हलकों के बीच के क्षेत्रों के योग / घटाव के रूप में जोड़े गए क्षेत्र को जोड़ते रहें। 3 सर्किलों के लिए उदाहरण के लिए (अतिरिक्त सर्कल C को कॉल करें) हम इस फॉर्मूले का उपयोग करके क्षेत्र को बाहर करते हैं:

(यह ऊपर के रूप में ही है जहाँ Aसे बदल दिया गया है A∪B)

area((A∪B)∪C) = area(A∪B) + area(C) - area((A∪B)∩C)

जहां area(A∪B)हमने अभी काम किया है, और area((A∪B)∩C)पाया जा सकता है:

area((A∪B)nC) = area((A∩C)∪(B∩C)) = area(A∩C) + area(A∩B) - area((A∩C)∩(B∩C)) = area(A∩C) + area(A∩B) - area(A∩B∩C)

जहां फिर से आप ऊपर से क्षेत्र (A∩B∩C) पा सकते हैं।

मुश्किल बिट अंतिम चरण है - जितने अधिक मंडलियां जुड़ती जाती हैं उतना अधिक जटिल हो जाता है। मेरा मानना ​​है कि एक परिमित संघ के साथ एक चौराहे के क्षेत्र के बाहर काम करने के लिए एक विस्तार है, या वैकल्पिक रूप से आप इसे पुनरावृत्ति करने में सक्षम हो सकते हैं।

मोंटे-कार्लो को पुनरावृत्ति के क्षेत्र के लगभग उपयोग करने के संबंध में, मेरा मानना ​​है कि उन हलकों में से 4 के चौराहे पर एक मनमानी संख्या के चौराहे को कम करना संभव है, जिसकी गणना बिल्कुल की जा सकती है (कोई भी विचार नहीं है कि यह कैसे करना है तथापि)।

इस btw को करने का एक बेहतर तरीका है - प्रत्येक अतिरिक्त सर्कल के लिए जटिलता काफी बढ़ जाती है (संभवतः तेजी से, लेकिन मुझे यकीन नहीं है)।


स्वरूपण के साथ क्या है? चौराहे और संघ के लिए n और u के उपयोग के बारे में भी खेद है, शायद एक बेहतर तरीका है ...
जस्टिन

1
कुछ यूनिकोड यूनियन (∪) और चौराहे (signs) संकेत जोड़े। उम्मीद है कि वे काम करेंगे।
Spoike

3

मैं घने खेतों में वास्तविक डिस्क क्षेत्रों से वास्तविक स्टार क्षेत्रों का अनुमान लगाने का प्रयास करते हुए ओवरलैपिंग स्टार क्षेत्रों का अनुकरण करने की समस्या पर काम कर रहा हूं, जहां बड़े उज्ज्वल सितारे बेहोशी का सामना कर सकते हैं। मैं भी कठोर औपचारिक विश्लेषण द्वारा ऐसा करने में सक्षम होने की उम्मीद कर रहा था, लेकिन कार्य के लिए एक एल्गोरिथ्म खोजने में असमर्थ था। मैंने हरे रंग की डिस्क के रूप में एक नीली पृष्ठभूमि पर स्टार फ़ील्ड उत्पन्न करके इसे हल किया, जिसका व्यास एक संभाव्यता एल्गोरिथ्म द्वारा निर्धारित किया गया था। एक साधारण दिनचर्या उन्हें यह देखने के लिए जोड़ सकती है कि क्या कोई ओवरलैप है (स्टार जोड़ी को पीला करते हुए); फिर रंगों की एक पिक्सेल गणना सैद्धांतिक क्षेत्र की तुलना में मनाया क्षेत्र उत्पन्न करती है। यह तब सही मायने रखता है के लिए एक संभावना वक्र उत्पन्न करता है। जानवर बल शायद, लेकिन यह ठीक काम करने लगता है। (स्रोत: 2from.com )


2

यहां एक एल्गोरिथ्म है जिसे अभ्यास में लागू करना आसान होना चाहिए, और मनमाने ढंग से छोटी त्रुटि उत्पन्न करने के लिए समायोजित किया जा सकता है:

  1. एक ही बिंदु पर केंद्रित एक नियमित बहुभुज द्वारा प्रत्येक वृत्त को अनुमानित करें
  2. बहुभुज की गणना करें जो अनुमानित सर्किलों का संघ है
  3. मर्ज किए गए बहुभुज के क्षेत्र की गणना करें

चरण 2 और 3 को कम्प्यूटेशनल ज्यामिति से मानक, आसानी से मिल जाने वाले एल्गोरिदम का उपयोग करके किया जा सकता है।

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


2

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

अतः बिना घिसने वाले सभी वृत्तों वाले आकृति पर, प्रत्येक स्थिति पर एक क्षैतिज रेखा खींचिए जो या तो एक वृत्त के ऊपर हो, एक वृत्त के नीचे या 2 मंडलियों के चौराहे पर। ध्यान दें कि इन स्ट्रिप्स के अंदर, उन सभी क्षेत्रों की गणना करने की आवश्यकता होती है, जो समान दिखते हैं: एक "ट्रेपेज़ियम" जो दो तरफ से गोलाकार खंडों से बदला गया हो। इसलिए यदि आप इस तरह के आकार की गणना करने के लिए काम कर सकते हैं, तो आप इसे सभी व्यक्तिगत आकृतियों के लिए करते हैं और उन्हें एक साथ जोड़ते हैं। इस भोले दृष्टिकोण की जटिलता ओ (एन ^ 3) है, जहां एन आंकड़े में मंडलियों की संख्या है। कुछ चतुर डेटा संरचना के उपयोग के साथ, आप इस लाइन-स्वीप विधि को O (N ^ 2 * log (N)) में सुधार सकते हैं, लेकिन जब तक आपको वास्तव में इसकी आवश्यकता नहीं है, यह संभवतः परेशानी के लायक नहीं है।


1

मुझे यह लिंक मिला जो उपयोगी हो सकता है। हालांकि इसका कोई निश्चित जवाब नहीं है। गूगल जवाब देता है । तीन हलकों के लिए एक और संदर्भ है हारुकी प्रमेय । वहां पर भी एक पेपर है।


1

आप जिस समस्या को हल करने की कोशिश कर रहे हैं, उसके आधार पर यह एक ऊपरी और निचली सीमा प्राप्त करने के लिए पर्याप्त हो सकता है। एक ऊपरी सीमा आसान है, बस सभी मंडलियों का योग है। निचली सीमा के लिए आप एक एकल त्रिज्या चुन सकते हैं जैसे कि कोई भी मंडल ओवरलैप न हो। बेहतर है कि प्रत्येक सर्कल के लिए सबसे बड़ा त्रिज्या (वास्तविक त्रिज्या तक) खोजें ताकि यह ओवरलैप न हो। किसी भी पूरी तरह से ओवरलैप किए गए सर्कल को हटाने के लिए भी बहुत तुच्छ होना चाहिए (ऐसे सभी सर्कल संतुष्ट हैं। P_a - P_b | <= r_a) जहां P_a सर्कल A का केंद्र है, P_b सर्कल B का केंद्र है, और r_a A का त्रिज्या है। ) और यह ऊपरी और निचले दोनों को बाध्य करता है। यदि आप सभी मंडलियों के योग के बजाय अपनी जोड़ी के फार्मूले का उपयोग मनमाने ढंग से जोड़े करने पर कर सकते हैं, तो आप एक बेहतर अपर बाउंड प्राप्त कर सकते हैं। "सबसे अच्छा" लेने का एक अच्छा तरीका हो सकता है

ऊपरी और निचले बाउंड को देखते हुए आप मोंटे-कार्लो दृष्टिकोण को बेहतर ढंग से ट्यून कर सकते हैं, लेकिन कुछ भी दिमाग में नहीं आता है। एक और विकल्प (फिर से आपके आवेदन के आधार पर) हलकों को व्यवस्थित करना और पिक्सेल की गणना करना है। यह एक निश्चित वितरण के साथ मूल रूप से मोंटे-कार्लो दृष्टिकोण है।


0

यह ग्रीन के प्रमेय का उपयोग करके हल किया जा सकता है , n ^ 2log (n) की जटिलता के साथ। यदि आप ग्रीन के प्रमेय से परिचित नहीं हैं और अधिक जानना चाहते हैं, तो यहां वीडियो और नोट्स खान अकादमी के हैं। लेकिन हमारी समस्या के लिए, मुझे लगता है कि मेरा वर्णन पर्याप्त होगा।

तस्वीरों के लिंक के लिए क्षमा करें, क्योंकि मैं चित्र पोस्ट नहीं कर सकता (पर्याप्त प्रतिष्ठा अंक नहीं)

ग्रीन के प्रमेय का सामान्य समीकरण

अगर मैं L और M को ऐसे डालूं

स्थिति

तब आरएचएस केवल रीजन आर का क्षेत्र है और इसे बंद इंटीग्रल या एलएचएस को हल करके प्राप्त किया जा सकता है और ठीक यही हम करने जा रहे हैं।

सभी यूनियनों को हलकों के इस तरह के निराशाजनक सेटों में तोड़ा जा सकता है, जो प्रतिच्छेद करते हैं

इसलिए एंटीलॉकवाइज में पथ के साथ एकीकरण हमें क्षेत्र का क्षेत्र देता है और दक्षिणावर्त के साथ एकीकरण हमें क्षेत्र का नकारात्मक देता है । इसलिए

AreaOfUnion = ( एंटिक्लॉकवाइज दिशा में लाल आर्क्स के साथ एकीकरण + घड़ी की दिशा में नीले आर्क के साथ एकीकरण)

लेकिन कूल ट्रिक प्रत्येक सर्कल के लिए है यदि हम आर्क्स को एकीकृत करते हैं जो किसी अन्य सर्कल के अंदर नहीं हैं तो हमें अपना आवश्यक क्षेत्र मिलता है अर्थात हम सभी लाल आर्क्स के साथ एक एंटीक्लॉकवाइज दिशा में एकीकरण प्राप्त करते हैं और क्लॉक वाइज दिशा के साथ सभी नीले आर्क के साथ एकीकरण करते हैं। काम हो गया!!!

यहां तक ​​कि ऐसे मामले भी जब कोई सर्कल किसी अन्य के साथ इंटरसेक्ट नहीं होता है।

यहाँ मेरा C ++ कोड GitHub लिंक है


-1

पिक्सेल-पेंटिंग दृष्टिकोण (@Ladmaster द्वारा सुझाया गया) विभिन्न तरीकों से गणितीय समाधान से बेहतर है:

  1. कार्यान्वयन बहुत सरल है। उपरोक्त समस्या को कोड की 100 से भी कम लाइनों में हल किया जा सकता है, क्योंकि यह JSFiddle समाधान प्रदर्शित करता है (ज्यादातर क्योंकि यह वैचारिक रूप से बहुत सरल है, और इसमें कोई किनारे के मामले या अपवाद नहीं हैं)।
  2. यह अधिक सामान्य समस्याओं को आसानी से स्वीकार करता है। यह आकारिकी की परवाह किए बिना किसी भी आकार के साथ काम करता है, जब तक कि यह 2D ड्राइंग लाइब्रेरी (यानी, "उन सभी!") के साथ रेंडर करने योग्य है - हलकों, दीर्घवृत्त, स्प्लिन, बहुभुज, आप इसे नाम देते हैं। हेक, यहां तक ​​कि बिटमैप छवियां।
  3. गणितीय चित्र के लिए ~ O [n * n] की तुलना में पिक्सेल-पेंटिंग समाधान की जटिलता ~ O [n] है। इसका मतलब है कि यह बेहतर प्रदर्शन करेगा क्योंकि आकृतियों की संख्या बढ़ जाती है।
  4. और प्रदर्शन की बात करें, तो आप अक्सर मुफ्त में हार्डवेयर त्वरण प्राप्त करेंगे, क्योंकि अधिकांश आधुनिक 2 डी लाइब्रेरी (जैसे एचटीएमएल 5 के कैनवास, मेरा मानना ​​है) ग्राफिक्स त्वरक के लिए रेंडरिंग कार्य को बंद कर देगा।

पिक्सेल-पेंटिंग के लिए एक नकारात्मक पहलू समाधान की परिमित सटीकता है। लेकिन यह केवल बड़ी या छोटी कैनवस के लिए ट्यून करने योग्य है जैसा कि स्थिति की मांग है। ध्यान दें, 2 डी रेंडरिंग कोड में एंटी-अलियासिंग (अक्सर डिफ़ॉल्ट रूप से चालू), पिक्सेल-स्तर की सटीकता से बेहतर होगा। इसलिए, उदाहरण के लिए, समान आयामों के कैनवास में 100x100 का आंकड़ा प्रदान करना, मुझे लगता है, 1 / (100 x 100 x 255) = .000039% के आदेश पर सटीकता प्राप्त करें ... जो संभवतः "काफी अच्छा" है। सभी के लिए, लेकिन सबसे ज्यादा मांग वाली समस्याएं।

<p>Area computation of arbitrary figures as done thru pixel-painting, in which a complex shape is drawn into an HTML5 canvas and the area determined by comparing the number of white pixels found in the resulting bitmap.  See javascript source for details.</p>

<canvas id="canvas" width="80" height="100"></canvas>

<p>Area = <span id="result"></span></p>
// Get HTML canvas element (and context) to draw into
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');

// Lil' circle drawing utility
function circle(x,y,r) {
  ctx.beginPath();
  ctx.arc(x, y, r, 0, Math.PI*2);
  ctx.fill();
}

// Clear canvas (to black)
ctx.fillStyle = 'black';
ctx.fillRect(0, 0, canvas.width, canvas.height);

// Fill shape (in white)
ctx.fillStyle = 'white';
circle(40, 50, 40);
circle(40, 10, 10);
circle(25, 15, 12);
circle(35, 90, 10);

// Get bitmap data
var id = ctx.getImageData(0, 0, canvas.width, canvas.height);
var pixels = id.data; // Flat array of RGBA bytes

// Determine area by counting the white pixels
for (var i = 0, area = 0; i < pixels.length; i += 4) {
  area += pixels[i]; // Red channel (same as green and blue channels)
}

// Normalize by the max white value of 255
area /= 255;

// Output result
document.getElementById('result').innerHTML = area.toFixed(2);

यह समाधान हलकों के क्षेत्रों के साथ गणितीय गणना करने में विफल रहता है। यह ओपी प्रश्न के बिंदु को याद करता है। बहुत बार प्रतिपादन ज्यामिति ज्यामितीय आकृतियों के साथ काम करते समय केवल आधी लड़ाई होती है
स्टीव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.