सर्किल अंतर्विभागों में विशेष क्षेत्र की खोज करना


17

यहाँ आपके लिए एक भ्रामक चुनौतीपूर्ण ज्यामिति पहेली है!

किसी मंडली Aऔर nअन्य मंडलियों को देखते हुए B[n], उसके भीतर मौजूद कुल क्षेत्रफल को खोजें, Aजो किसी भी घेरे के भीतर नहीं है B

आपका कोड यथासंभव छोटा होना चाहिए।

इनपुट

आपके इनपुट में निम्नलिखित जानकारी होनी चाहिए:

  • वृत्त की त्रिज्या का प्रतिनिधित्व करने के लिए एक अस्थायी-बिंदु संख्या A
  • में वृत्त की त्रिज्या का प्रतिनिधित्व करने के लिए फ्लोटिंग-पॉइंट नंबरों की एक सूची B
  • मंडलियों के केंद्रों की एक सूची B। आपका कार्यक्रम ध्रुवीय या कार्टेशियन निर्देशांक में केंद्रों की अपेक्षा कर सकता है।
  • वैकल्पिक रूप से, आपको nB में मंडलियों की संख्या प्राप्त हो सकती है। इस इनपुट की आवश्यकता नहीं है।

यह माना जाएगा कि वृत्त Aका केंद्र मूल है, अर्थात, बिंदु (0, 0)

यह गारंटी दी जाती है कि कोई भी दो वृत्त Bसमान नहीं हैं, लेकिन यह गारंटी नहीं है कि: सभी वृत्त Bखंड A, सभी केंद्र Bबाहर हैं A, या कोई भी दो वृत्त Bएक-दूसरे को नहीं काटते हैं। सुनिश्चित करें कि आपका समाधान विभिन्न किनारे के मामलों को संभाल सकता है।

आप किसी भी क्रम में इनपुट प्राप्त कर सकते हैं, और पाठ इनपुट के रूप में (स्टडिन या आपकी भाषा के समकक्ष के माध्यम से), फ़ंक्शन पैरामीटर, या कमांड-लाइन तर्क।

यदि आप पाठ इनपुट प्राप्त करना चुनते हैं, तो इनपुट के टुकड़ों के बीच एक या दो-चरित्र मुद्रण योग्य ASCII सीमांकक होना चाहिए।

उत्पादन

आपके प्रोग्राम या फंक्शन को किसी भी फ्लोटिंग-पॉइंट नंबर को आउटपुट करना चाहिए, जिसमें Aसे किसी भी सर्कल के भीतर के कुल क्षेत्र का प्रतिनिधित्व नहीं करना चाहिए B। आपके उत्तर सभी परीक्षण मामलों के लिए कम से कम तीन महत्वपूर्ण आंकड़ों के लिए सटीक होना चाहिए।

सामान्य नियम लागू होते हैं।

आपका समाधान किसी क्षेत्र को निर्धारित करने के लिए मंडलियों के भीतर नमूना बिंदुओं पर निर्भर नहीं होना चाहिए।

बिल्ट-इन जो स्वचालित रूप से हलकों के चौराहों का पता लगाता है, हलकों के चौराहों के भीतर के क्षेत्रों का पता लगाता है, या इस समस्या को तुरंत हल कर देता है।

परीक्षण के मामलों

प्रत्येक छवि में, चक्र Aको नीले रंग में रेखांकित किया गया है, Bहरे और भरे हुए काले रंग में हलकों के साथ । जो क्षेत्र वापस किया जाना चाहिए, वह लाल रंग से भरा हुआ है।

( मेरे समाधानों की जाँच के लिए रेनर पी। का विशेष धन्यवाद )

टेस्ट केस 1:

A = {x: 0, y: 0, rad: 50}
B[0] = {x: 0, y: 0, rad: 100}

टेस्ट केस 1

Result: 0.00

टेस्ट केस 2:

A = {x: 0, y: 0, rad: 100.000000}
B[0] = {x: 100.000000, y: 0.000000, rad: 50.000000}
B[1] = {x: 30.901699, y: -95.105652, rad: 50.000000}
B[2] = {x: -80.901699, y: -58.778525, rad: 50.000000}
B[3] = {x: -80.901699, y: 58.778525, rad: 50.000000}
B[4] = {x: 30.901699, y: 95.105652, rad: 50.000000}

टेस्ट केस २

Result: 1.3878e+04

टेस्ट केस 3:

A = {x: 0, y: 0, rad: 138}
B[0] = {x: 100, y: 0, rad: 100}
B[1] = {x: -50, y: -86, rad: 100} 
B[2] = {x: -93, y: 135, rad: 50}

टेस्ट केस 3

Result: 1.8969e+04

टेस्ट केस 4:

A = {x: 0, y: 0, rad: 121.593585}
B[0] = {x: 81.000000, y: 107.000000, rad: 59.841457}
B[1] = {x: -152.000000, y: -147.000000, rad: 50.000000}
B[2] = {x: 43.000000, y: -127.000000, rad: 105.118980}
B[3] = {x: 0.000000, y: -72.000000, rad: 57.870545}
B[4] = {x: -97.000000, y: -81.000000, rad: 98.488578}
B[5] = {x: -72.000000, y: 116.000000, rad: 66.468037}
B[6] = {x: 2.000000, y: 51.000000, rad: 50.000000}

टेस्ट केस 4

Result: 1.1264e+04

टेस्ट केस 5:

A = {x: 0, y: 0, rad: 121.605921}
B[0] = {x: 0.000000, y: -293.000000, rad: 250.000000}
B[1] = {x: 0.000000, y: -56.000000, rad: 78.230429}
B[2] = {x: 0.000000, y: -102.000000, rad: 100.000000}

टेस्ट केस 5

Result: 2.6742e+04

सुझाया गया पढ़ना:

Fewell, MP "तीन सर्किलों के सामान्य ओवरलैप का क्षेत्र।" 2006 अक्टूबर। वेब। http://dspace.dsto.defence.gov.au/dspace/bitstream/1947/4551/4/DSTO-TN-0722.PR.pdf


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

आपको ऐसा लगता नहीं है कि एक परीक्षण का मामला है जिसमें एक सर्कल में Bदूसरा शामिल है। वह जोड़ने लायक हो सकता है।
मार्टिन एंडर

क्या आप अपने तीसरे परीक्षण के मामले की जाँच कर सकते हैं? मुझे मिल रहा है 1.8970e+04
लीजनमोनमल 978

@ मार्टिनबटनर मैं भी दुर्घटना पर समस्या के बारे में आया। मैं अपने समाधान से अधिक प्रसन्न नहीं हूँ, लेकिन यह काम करने लगता है। मैं उस मामले के लिए थोड़ा परीक्षण तैयार करने की कोशिश करूँगा, धन्यवाद!
BrainSteel

@ LegionMammal978 हाँ, ऐसा लगता है कि मामला गलत है। मैं हलकों के बीच चौराहों के लिए निम्नलिखित डेटा है: B[0] - A intersection: 20653.659515, B[1] - A intersection: 20757.824115, B[1] - B[0] intersection: 1841.847766, B[2] - A intersection: 1289.164541, जो पैदावार 18969.69009जवाब के रूप में।
BrainSteel

जवाबों:


14

पायथन 2, 631 बाइट्स

from cmath import*
C=input()
O,R=C[0]
def I(p,r,q,s):
 try:q-=p;d=abs(q*q);x=(r*r-s*s+d)/d/2;return[p+q*(x+z*(r*r/d-x*x)**.5)for z in-1j,1j]
 except:return[]
S=sorted
V=S(i.real for p,r in C for c in C for i in[p-r,p+r]+I(p,r,*c)if-R<=(i-O).real<=R)
A=pi*R*R
for l,r in zip(V,V[1:]):
 H=[]
 for p,t in C:
    try:
     for s in-1,1:a,b=[p.imag+s*(t*t-(p.real-x)**2)**.5for x in l,r];H+=[a+b,a,b,s,t,p],
    except:0
 a,b=H[:2];H=S(H[2:]);n=0;c=a
 for d in H:
    s=d[3];z=.5;H*=d<b
    for q,w,e,_,t,y in(c,min(d,b))*(n-s<(a<d)or[0]*n>H):\
g=phase((l+w*1j-y)/(r+e*1j-y));A-=abs(g-sin(g)).real*t*t/2-z*q*(r-l);z=-z
    n-=s
    if(a<d)*s*n==-1:c=d
print A

लाइन-ब्रेक से पहले \आसान पढ़ने के लिए हैं, और स्कोर में नहीं गिने जाते हैं।

(center, radius)जोड़े की सूची के रूप में एसटीडीआईएन के माध्यम से इनपुट पढ़ता है , जहां centerफॉर्म में एक जटिल संख्या है X+Yj। सूची में पहला सर्कल A है (जिसका केंद्र मूल पर नहीं है), और बाकी सूची है B है । परिणाम को STDOUT में प्रिंट करता है।

उदाहरण

Input:  (0+0j, 138),  (100+0j, 100), (-50+-86j, 100), (-93+135j, 50)
Output: 18969.6900901

व्याख्या

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

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

आकृति 1

हम के चौराहे के क्षेत्र की तलाश कर रहे हैं और ऊपर के चित्रण में बी लाल रंग के क्षेत्र में हलकों के संघ के लिए । यह वह क्षेत्र है जिसका परिणाम प्राप्त करने के लिए हमें A से घटाना होगा ।

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

चित्र 2

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

ये सभी आर्क प्रासंगिक नहीं हैं; हम केवल उन लोगों में रुचि रखते हैं जो और बी के बीच के चौराहे की सीमा पर हैं । उन लोगों को खोजने के लिए, हम आर्क्स टॉप-टू-बॉटम को सॉर्ट करते हैं (ध्यान दें कि आर्क्स एक दूसरे को अच्छी तरह से नहीं काट सकते हैं, क्योंकि इससे दोनों के बीच एक और ऊर्ध्वाधर रेखा का अस्तित्व होगा, जिस पर हम विचार कर रहे हैं, और इसलिए यह बात करने के लिए समझ में आता है। एक मनमाना चाप ऊपर, या नीचे, किसी अन्य के बारे में।)

चित्र तीन

हम, आर्क्स पार करते हुए की गिनती रखने के क्रम में, बी हलकों हम वर्तमान में अंदर कर रहे हैं, एन । अगर एन 0 से 1 में परिवर्तन हम अंदर कर रहे हैं, जबकि एक , या हम के शीर्ष चाप पर कर रहे हैं एक , जबकि एन अशून्य, एक समलम्ब में से एक पैर को तो वर्तमान चाप मेल खाती है। यदि n A के अंदर होने पर 1 से 0 तक बदलता है , या यदि हम A के निचले चाप पर हैं तो nनॉनज़ेरो है, तो वर्तमान चाप उसी ट्रेपोज़ॉइड के दूसरे पैर से मेल खाती है। एक बार जब हम आर्क्स (ऊपर के चित्रण में दो चमकीले पीले आर्क्स) की एक जोड़ी पाते हैं, तो हम संबंधित ट्रेपोज़ॉइड और दो आर्क सेगमेंट के क्षेत्र की गणना करते हैं, और इसे से घटाए जाने वाले कुल क्षेत्र में जोड़ते हैं ।

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

चित्र 4


1
यह इस तरह का समाधान है जिस पर मैं विचार कर रहा था, सिवाय इसके कि मुझे टारगेट और ट्रेपर्स को ए में नहीं बल्कि बी (जिनके क्षेत्रों को एक त्रिकोण या ट्रेपॉइड से एक आर्क सेगमेंट को निकालना होगा) को खोजने के द्वारा सीधे लक्ष्य क्षेत्र मिला होगा।
क्विंटोपिया 15

@ क्विंटोपिया यह थोड़ा छोटा भी हो सकता है, क्योंकि यह हमें के क्षेत्र की गणना करने की आवश्यकता को बचाता है , और यह सब लगता है शायद n पर स्थिति के साथ थोड़ा खेल रहा है ।
एल

@ क्विंटोपिया ओटोह, आपको पैरों में से एक के बगल में एक सकारात्मक चाप होने की संभावना के लिए खाता होगा, अगर यह का एक आर्क खंड है , तो कौन जानता है ...
एलएल

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