Java

2012-01-10 8 views
6

bir daire içinde kesişen kısmının boyutunu almak için nasıl bu görüntünün siyah kısmının boyutunu gerek WebsiteJava

, R, ikinci dairenin yarıçapı ve arasındaki mesafe r çemberin yarıçapı pict http://mathworld.wolfram.com/images/equations/Circle-CircleIntersection/Inline41.gif

olarak alma son cevap d: ve bu web sitesine işaret edilmiştir iki merkez.

bu boyutunu almak için kullanmaya çalıştı kodu şuydu:

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 
Bazı testler yaptım

ve çıkış şuydu:

1345.9663  621.6233 971.1231 246.78008  20.0 25.0 43.528286 

Böylece belirtir örtüşen parçanın boyutu dairenin kendisinden daha büyüktü (r^2 * PI).

Neyi yanlış yaptım?

+1

Daha az gösterim hatası alacağından "float" yerine "double" kullanırım, ancak sizin açıklamanız için yeterli değil. ;) –

+1

Bize deltaX ve Y için formül gösterebilir misiniz, çünkü doğru görünmüyorlar? GetRadius() ve getRadius1() arasındaki fark nedir? –

+0

Neden getRadius1() ve e.getRadius1() var? R yarıçapını almayı mı unuttunuz? – Max

cevap

5

Sadece bir tahmin (yorumumda belirtildiği gibi): Math.toRadians(...) dönüşümünü kaldırmayı deneyin. bir formül katılan derece değil yarıçapları olduğu için

, I cos -1 (...) önceden radyan bir değer için parametrelerinin belirlenmesi. İki merkez arasında hat üzerinde bindirme diliminin uzunluğu 20 + 25 - 43.5 = 1.5 (yaklaşık olarak)

olduğundan 11.163887023925781 mantıklı görünüyor: Ben dönüşüm kaldırmak ve kodunuzu çalıştırırsanız

, şu örtüşme alanı boyutunu almak Düzenleme: I (küçük daire tamamen bir kenar büyük içerdiği ancak dokunur olan) daha küçük dairenin tam alan üst üste binme alanı boyutu 1256.63 elde 5'e mesafeyi ayarlamak ise

(20 * Π) . Hesaplama, mesafe yarıçap farkından daha küçükse (örn. Durumunuz 5'ten küçükse) işe yaramaz, ancak bu sayısal bir temsil problemi olabilir (normal veri türleri, bazılarını temsil edemeyebilir). ara sonuçların).

+1

'Math.acos (Math.toRadians (...))' Math.acos() 'ın argümanı bir açı olmadığı için kesinlikle yanlıştır. Math.acos() 'ın argümanı -1 ile 1 arasında bir değer olmalı ve radyanlarda bir değer döndürecektir. –

+0

Bu yaptı, teşekkürler. – Lolmewn

+0

Merhaba, kesişen noktaları nasıl alabilirim? Lütfen çözümü burada öneriniz http://stackoverflow.com/questions/38177728/how-to-get-the-intersecting-points-from-shape-in-elasticsearch –