Hmm, vấn đề rất thú vị. Cách tiếp cận của tôi có thể sẽ là một cái gì đó dọc theo các dòng sau:
- Tìm ra cách tính diện tích giao nhau giữa một số hình tròn tùy ý là gì, tức là nếu tôi có 3 hình tròn, tôi cần tìm ra giao điểm giữa các hình tròn đó là gì. Phương pháp "Monte-Carlo" sẽ là một cách tốt để ước lượng điều này ( http://local.wasp.uwa.edu.au/~pbourke/geometry/circlearea/ ).
- Loại bỏ bất kỳ vòng tròn nào được chứa hoàn toàn trong một vòng tròn khác lớn hơn (nhìn vào bán kính và môđun của khoảng cách giữa tâm của hai vòng tròn) Tôi không nghĩ là bắt buộc.
- Chọn 2 hình tròn (gọi chúng là A và B) và tính tổng diện tích bằng công thức sau:
(điều này đúng với bất kỳ hình dạng nào, có thể là hình tròn hoặc hình dạng khác)
area(A∪B) = area(A) + area(B) - area(A∩B)
Ở đâu A ∪ B
có nghĩa là A kết hợp B và A ∩ B
có nghĩa là A giao nhau B (bạn có thể giải quyết điều này từ bước đầu tiên.
- Bây giờ tiếp tục thêm các vòng tròn và tiếp tục tính diện tích được thêm vào dưới dạng tổng / trừ các diện tích của các vòng tròn và các khu vực giao nhau giữa các vòng tròn. Ví dụ đối với 3 hình tròn (gọi là vòng tròn phụ C), chúng tôi tính diện tích bằng công thức sau:
(Điều này giống như ở trên, nơi A
đã được thay thế bằng A∪B
)
area((A∪B)∪C) = area(A∪B) + area(C) - area((A∪B)∩C)
Nơi area(A∪B)
chúng tôi vừa làm việc và area((A∪B)∩C)
có thể tìm thấy:
area((A∪B)nC) = area((A∩C)∪(B∩C)) = area(A∩C) + area(A∩B) - area((A∩C)∩(B∩C)) = area(A∩C) + area(A∩B) - area(A∩B∩C)
Nơi bạn có thể tìm thấy khu vực (A∩B∩C) từ phía trên.
Một chút khó khăn là bước cuối cùng - càng nhiều vòng tròn được thêm vào thì nó càng trở nên phức tạp hơn. Tôi tin rằng có một sự mở rộng để tính ra khu vực giao nhau với một liên hợp hữu hạn, hoặc cách khác, bạn có thể tính toán nó một cách đệ quy.
Ngoài ra, liên quan đến việc sử dụng Monte-Carlo để tính gần đúng diện tích của phần nghiêng, tôi tin rằng có thể giảm giao điểm của một số hình tròn tùy ý thành giao điểm của 4 trong số các hình tròn đó, điều này có thể được tính toán chính xác (không biết làm thế nào để làm điều này Tuy nhiên).
Có lẽ có một cách tốt hơn để làm điều này btw - độ phức tạp tăng lên đáng kể (có thể theo cấp số nhân, nhưng tôi không chắc chắn) cho mỗi vòng kết nối bổ sung được thêm vào.