2012-01-10 12 views
6

में एक सर्कल में काटते हुए भाग का आकार पाने के लिए मैं इस छवि के काले भाग का आकार की जरूरत है:
Imageजावा

के बारे में मैं बहुत शोध किया है कि कैसे सामान्य गणित में यह पता लगाने के लिए Website

हो रही यह pict http://mathworld.wolfram.com/images/equations/Circle-CircleIntersection/Inline41.gif

जहां r पहला वृत्त की त्रिज्या है था पर अंतिम जवाब, आर दूसरा वृत्त की त्रिज्या, और बीच की दूरी डी: है, और मैं इस वेबसाइट की ओर इशारा किया गया था दो केंद्र

कोड मैं इस के आकार पाने के लिए उपयोग करने के लिए करने की कोशिश की निम्नलिखित था:

float r = getRadius1(); 
float R = e.getRadius1(); 
float deltaX = Math.abs((getX() + getRadius()) - (e.getX() + e.getRadius())); 
float deltaY = Math.abs((getY() + getRadius()) - (e.getY() + e.getRadius())); 
float d = (float) Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2)); 

float part, part2, part3; 
//Chopping it in parts, because it's easier. 

part = (float) (Math.pow(r,2) * Math.acos(
     Math.toRadians((Math.pow(d, 2) + Math.pow(r, 2) - Math.pow(R, 2))/(2*d*r)))); 

part2 = (float) (Math.pow(R,2) * Math.acos(
     Math.toRadians((Math.pow(d, 2) + Math.pow(R, 2) - Math.pow(r, 2))/(2*d*R)))); 

part3 = (float) (0.5 * Math.sqrt((-d + r + R) * (d+r-R) * (d-r+R) * (d+r+R))); 

float res = part + part2 - part3; 

Main.log(res + "  " + part + " " + part2 + " " + part3+ "  " 
     + r + " " + R + " " + d); 
//logs the data and System.out's it 

मैं कुछ परीक्षण किया था, और उत्पादन इस था:

1345.9663  621.6233 971.1231 246.78008  20.0 25.0 43.528286 

ताकि जो इंगित करता है ओवरलैपिंग भाग का आकार सर्कल से बड़ा था (जो r^2 * PI है)।

मैंने क्या गलत किया?

+1

मैं 'फ्लोट' के बजाय 'डबल' का उपयोग करूंगा क्योंकि इसमें कम प्रतिनिधित्व त्रुटि होगी, लेकिन आपकी व्याख्या करने के लिए पर्याप्त नहीं है। ;) –

+1

क्या आप हमें डेल्टाएक्स और वाई के लिए सूत्र दिखा सकते हैं क्योंकि वे सही नहीं दिख रहे हैं? GetRadius() और getRadius1() के बीच क्या अंतर है? –

+0

आपको Radius1() और e.getRadius1() क्यों मिलता है? क्या आप आर के त्रिज्या को भूलना भूल रहे हैं? – Max

उत्तर

5

बस एक अनुमान (जैसा कि मेरी टिप्पणी में बताया गया है): Math.toRadians(...) रूपांतरण को हटाने का प्रयास करें।

चूंकि कोई सूत्र में शामिल डिग्री बल्कि जीवाएं हैं, मैं क्योंकि -1 (...) पहले से ही रेडियन में एक मूल्य है पैरामीटर मान।

यदि मैं रूपांतरण को हटा दें और अपने कोड चलाने के लिए, मैं निम्नलिखित ओवरलैप क्षेत्र आकार: 11.163887023925781 जो प्रशंसनीय लगता है के बाद से दो केन्द्रों के बीच की रेखा पर ओवरलैप खंड की लंबाई 20 + 25 - 43.5 = 1.5 (अनुमानित)

है संपादित:

अगर मैं (छोटे वृत्त पूरी तरह से अपनी बढ़त बड़ा एक में शामिल थी, लेकिन छू लेती है) मैं ओवरलैप क्षेत्र आकार 1256.63 जो वास्तव में छोटे वृत्त का क्षेत्रफल है प्राप्त करने के लिए 5 दूरी सेट (20 * Π) । गणना काम नहीं लगती है अगर दूरी त्रिज्या के अंतर से छोटी है (यानि आपके मामले में 5 से कम), लेकिन यह संख्यात्मक प्रतिनिधित्व की समस्या हो सकती है (सामान्य डेटाटाइप कुछ का प्रतिनिधित्व करने में सक्षम नहीं हो सकता है मध्यवर्ती परिणामों के)।

+1

'Math.acos (Math.toRadians (...))' निश्चित रूप से गलत है, क्योंकि 'Math.acos()' के लिए तर्क एक कोण नहीं है। 'Math.acos()' के लिए तर्क -1 और 1 के बीच मान होना चाहिए, और रेडियंस में एक मान वापस कर देगा। –

+0

यह किया, धन्यवाद। – Lolmewn

+0

हाय, अंतरंग बिंदु कैसे प्राप्त करें? कृपया यहां समाधान का सुझाव दें http://stackoverflow.com/questions/38177728/how-to-get-the-intersecting-points-from-shape-in-elasticsearch –