2012-01-10 20 views
6

Tôi cần kích thước của phần màu đen của hình ảnh này:
ImageLàm thế nào để có được kích thước của phần giao nhau trong một vòng tròn trong Java

tôi đã thực hiện một số nghiên cứu về làm thế nào để tìm thấy nó trong toán học bình thường , và tôi đã chỉ vào trang web này: Website

Câu trả lời cuối cùng về việc nó là pict http://mathworld.wolfram.com/images/equations/Circle-CircleIntersection/Inline41.gif

trong đó r là bán kính của vòng tròn đầu tiên, R bán kính của vòng tròn thứ hai, và d khoảng cách giữa hai trung tâm.

Mã tôi cố gắng sử dụng để có được kích thước của điều này là như sau:

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 

tôi đã làm một số thử nghiệm, và đầu ra là thế này:

1345.9663  621.6233 971.1231 246.78008  20.0 25.0 43.528286 

Vì vậy, đó chỉ ra rằng kích thước của phần chồng chéo lớn hơn chính vòng tròn (là r^2 * PI).

Tôi đã làm gì sai?

+1

Tôi sẽ sử dụng 'double' thay vì' float' vì nó sẽ có ít lỗi biểu diễn hơn, nhưng không đủ để giải thích lỗi của bạn. ;) –

+1

Bạn có thể cho chúng tôi thấy công thức của deltaX và Y vì chúng trông không đúng không? Sự khác nhau giữa getRadius() và getRadius1() là gì? –

+0

Tại sao bạn có getRadius1() và e.getRadius1()? Bạn quên để có được bán kính của r? – Max

Trả lời

5

Chỉ cần đoán (như đã nêu trong nhận xét của tôi): hãy thử xóa chuyển đổi Math.toRadians(...).

Vì không có bằng cấp có liên quan trong công thức mà là bán kính, tôi giả sử các tham số để cos -1 (...) đã là một giá trị trong radian.

Nếu tôi loại bỏ các chuyển đổi và chạy mã của bạn, tôi nhận được kích thước khu vực chồng chéo sau: 11.163887023925781 mà có vẻ hợp lý vì chiều dài của đoạn chồng chéo trên ranh giới giữa hai trung tâm là 20 + 25 - 43.5 = 1.5 (xấp xỉ)

Chỉnh sửa:

Nếu tôi đặt khoảng cách là 5 (vòng tròn nhỏ hơn hoàn toàn chứa lớn hơn nhưng chạm vào cạnh của nó) Tôi nhận được diện tích chồng lên nhau 1256.63 chính xác diện tích của vòng tròn nhỏ hơn (20 * Π) . Tính toán dường như không hoạt động nếu khoảng cách nhỏ hơn sự khác biệt của bán kính (ví dụ trong trường hợp của bạn nhỏ hơn 5), nhưng đó có thể chỉ là vấn đề biểu diễn số (các kiểu dữ liệu bình thường có thể không thể đại diện cho một số của các kết quả trung gian).

+1

'Math.acos (Math.toRadians (...))' chắc chắn là sai, vì đối số 'Math.acos()' không phải là một góc. Đối số cho 'Math.acos()' phải là một giá trị giữa -1 và 1, và sẽ trả về một giá trị theo radian. –

+0

Điều này đã làm điều đó, cảm ơn. – Lolmewn

+0

Xin chào, Cách nhận điểm giao nhau? Vui lòng đề xuất giải pháp tại đây http://stackoverflow.com/questions/38177728/how-to-get-the-intersecting-points-from-shape-in-elasticsearch –

Các vấn đề liên quan