2010-11-22 13 views
13

को देखते हुए दो हलकों:चौराहे के क्षेत्र दो के बीच मंडलियां

  • (x1, y1) पर radius1
  • सी 2 के साथ (x2, y2) पर radius2

साथ सी 1 कैसे आप की गणना करना उनके चौराहे का क्षेत्र? सभी मानक गणित कार्य (sin, cos, आदि) निश्चित रूप से उपलब्ध हैं।

+0

http://mathworld.wolfram.com/Circle-CircleIntersection.html –

+0

धन्यवाद। मैं वास्तव में पोस्ट करने से पहले लिंक के बारे में पता था। मैं वास्तव में सूचीबद्ध चर का उपयोग कर एक विशिष्ट समीकरण की तलाश में था। –

उत्तर

24

ठीक है, समीकरण 14 को देखने के लिए Wolfram लिंक और मिथ्या नाम के क्यू का उपयोग कर, मैं निम्नलिखित जावा समाधान चर मैं सूचीबद्ध और केन्द्रों के बीच की दूरी का उपयोग कर ली गई है (जो तुच्छता से उन लोगों से प्राप्त किया जा सकता):

Double r = radius1; 
Double R = radius2; 
Double d = distance; 
if(R < r){ 
    // swap 
    r = radius2; 
    R = radius1; 
} 
Double part1 = r*r*Math.acos((d*d + r*r - R*R)/(2*d*r)); 
Double part2 = R*R*Math.acos((d*d + R*R - r*r)/(2*d*R)); 
Double part3 = 0.5*Math.sqrt((-d+r+R)*(d+r-R)*(d-r+R)*(d+r+R)); 

Double intersectionArea = part1 + part2 - part3; 
+0

मेटा में अपना मेटा-नोट पोस्ट करें http://meta.stackoverflow.com/ –

+0

हाँ, मैंने वहां जांच की है और पहले से ही एक धागा है जहां आधिकारिक तौर पर उत्तर दिया गया जवाब यह है कि वापस आना और अपने प्रश्न का उत्तर देना अच्छा है । लेकिन ऐसा लगता है कि ज्यादातर SO उपयोगकर्ता वास्तव में उस नीति का पालन नहीं करते हैं। Misnomer के लिए कोई अपराध नहीं है और मैं उसकी मदद करने की कोशिश कर उसकी सराहना करता हूं। लेकिन, अभी, मुझे एक लिंक देने के लिए 3 अप-वोट हैं जो मुझे पोस्ट करने से पहले ही पता था। मैंने उस लिंक में जानकारी को कोड में अनुवाद करने का कड़ी मेहनत की है और केवल 1 अप-वोट है। मैंने इस तरह के भीड़ व्यवहार को बार-बार देखा है और यह मुझे परेशान करता है। –

+0

@ क्रिस..क्या तुमने मेरा जवाब कम कर दिया क्योंकि ... आप चाहते थे कि तुम्हारा अधिक उत्साह हो .. अब वह मुझे परेशान करता है..मैं तुम्हारी बात पर बहस नहीं करूंगा..क्योंकि यह मेरे अनुसार मूर्खतापूर्ण है .. ।जो भी हो..अगली बार डाउनवॉट्स को समझाते हुए कम से कम एक टिप्पणी छोड़ दें .. – Vishal

10

आप इस analytical solution को देखना और अपने इनपुट मान के साथ सूत्र लागू करना चाहते हैं।

एक और फॉर्मूला दिया here -

Area = r^2*(q - sin(q)) where q = 2*acos(c/2r), 
where c = distance between centers and r is the common radius. 
+0

+1 पहले लिंक में फॉर्मूला का पूर्ण व्युत्पन्न है। दूसरा सर्कल का त्रिज्या समान होता है तो दूसरा उपयोगी होता है। – eaj

+0

लिंक के लिए धन्यवाद। क्या कोई और सामान्य सूत्र है जिसे विशेष रूप से दिए गए चर (उदाहरण के लिए एक सामान्य त्रिज्या नहीं मानते) का उपयोग करके प्राप्त किया जा सकता है? –

+1

ऐसा लगता है कि पहला लिंक ईक 14 आपको एक सामान्य समाधान देता है लेकिन मुझे यह देखने के लिए गणित को ब्रश करने की ज़रूरत है कि वास्तव में क्या हो रहा है ... आपको सर्कल के त्रिज्या से अधिक की आवश्यकता हो सकती है ताकि यह उपयोगी हो सके- http : //2000clicks.com/MathHelp/GeometryConicSectionCircleIntersection.aspx – Vishal

18

यहाँ एक जावास्क्रिप्ट समारोह है कि वास्तव में क्या क्रिस था के बाद:

function areaOfIntersection(x0, y0, r0, x1, y1, r1) 
{ 
    var rr0 = r0 * r0; 
    var rr1 = r1 * r1; 
    var d = Math.sqrt((x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0)); 
    var phi = (Math.acos((rr0 + (d * d) - rr1)/(2 * r0 * d))) * 2; 
    var theta = (Math.acos((rr1 + (d * d) - rr0)/(2 * r1 * d))) * 2; 
    var area1 = 0.5 * theta * rr1 - 0.5 * rr1 * Math.sin(theta); 
    var area2 = 0.5 * phi * rr0 - 0.5 * rr0 * Math.sin(phi); 
    return area1 + area2; 
} 

हालांकि, यदि यह सर्कल दूसरे के अंदर पूरी तरह से है, तो वे इस विधि को नाइन वापस कर देंगे, या वे बिल्कुल छू रहे नहीं हैं।

function areaOfIntersection(x0, y0, r0, x1, y1, r1) 
{ 
    var rr0 = r0 * r0; 
    var rr1 = r1 * r1; 
    var d = Math.sqrt((x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0)); 

    // Circles do not overlap 
    if (d > r1 + r0) 
    { 
    return 0; 
    } 

    // Circle1 is completely inside circle0 
    else if (d <= Math.abs(r0 - r1) && r0 >= r1) 
    { 
    // Return area of circle1 
    return Math.PI * rr1; 
    } 

    // Circle0 is completely inside circle1 
    else if (d <= Math.abs(r0 - r1) && r0 < r1) 
    { 
    // Return area of circle0 
    return Math.PI * rr0; 
    } 

    // Circles partially overlap 
    else 
    { 
    var phi = (Math.acos((rr0 + (d * d) - rr1)/(2 * r0 * d))) * 2; 
    var theta = (Math.acos((rr1 + (d * d) - rr0)/(2 * r1 * d))) * 2; 
    var area1 = 0.5 * theta * rr1 - 0.5 * rr1 * Math.sin(theta); 
    var area2 = 0.5 * phi * rr0 - 0.5 * rr0 * Math.sin(phi); 

    // Return area of intersection 
    return area1 + area2; 
    } 
} 

मैं जानकारी Math Forum में पाया पढ़कर इस समारोह ने लिखा है: एक थोड़ा अलग संस्करण है कि इन परिस्थितियों में विफल नहीं इस प्रकार है। मुझे Wolfram MathWorld स्पष्टीकरण से यह स्पष्ट मिला।

+0

धन्यवाद - यह मेरी मदद करता है! संशोधित संस्करण ठीक वही था जो मैं बाद में था। – scipilot

+0

यह उत्तर गलत है। मुझे पूरी तरह से यकीन नहीं है कि लॉजिकल बग कहां है, लेकिन यह कम से कम इन मामलों में विफल रहता है (जब आर 1 नीचे से 2 तक पहुंचता है): x0 = 0, y0 = 0, r0 = 1, x1 = 1, y0 = 0, r1 = 2। विशेष रूप से, आपका कोड क्षेत्र को पीआई के पास देता है, जब इसे पीआई/2 के पास आना चाहिए। – user1145925

+1

@ user1145925, इनपुट x0 = 0, y0 = 0, r0 = 1, x1 = 1, y0 = 0, r1 = 2 पीआई का आउटपुट सही है क्योंकि सर्कल 0 में पीआई का क्षेत्र है, और पूरी तरह से सर्कल के भीतर निहित है 2। –

संबंधित मुद्दे