Хм, очень интересная проблема.Мой подход, вероятно, будет что-то вдоль линий следующее:
- Разработайте способ работы, что в области пересечения между произвольным числом кругов, то есть если у меня есть 3 круга, я должен быть способный определить, что такое пересечение между этими кругами. Метод «Монте-Карло» был бы хорошим способом аппроксимировать это (http://local.wasp.uwa.edu.au/~pbourke/geometry/circlearea/).
- Исключить любые круги, которые содержатся целиком в другом увеличенном круге (посмотрите на радиус и модуль расстояния между центром двух кругов). Я не считаю это обязательным.
- Выберите 2 круга (назовем их А и Б) и разработать общую площадь, используя следующую формулу:
(это верно для любой формы, будь то круг или иным образом)
area(A∪B) = area(A) + area(B) - area(A∩B)
Где A ∪ B
означает соединение B и A ∩ B
означает пересекаться B (вы можете решить эту проблему с первого шага.
- Теперь продолжайте добавлять круги и продолжать работать вне а, rea добавляется как сумма/вычитание областей кругов и областей пересечений между кругами. Например, для 3-х кругов (назовем дополнительный круг C) мы разрабатываем область, используя эту формулу:
(Это то же самое, что и выше, где A
был заменен A∪B
)
area((A∪B)∪C) = area(A∪B) + area(C) - area((A∪B)∩C)
Где area(A∪B)
мы только разработали, и area((A∪B)∩C)
можно найти:
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)
Где снова вы можете найти область (A∩B∩C) сверху.
Сложный бит - это последний шаг - чем больше кругов добавляется, тем сложнее становится. Я считаю, что есть расширение для разработки области пересечения с конечным объединением, или, альтернативно, вы сможете рекурсивно ее выработать.
Кроме того, что касается использования Монте-Карло для приближения к области его пересечения, я считаю возможным уменьшить пересечение произвольного числа окружностей до пересечения 4 этих кругов, которые могут быть рассчитаны точно (нет идеи как это сделать, однако).
Существует, вероятно, лучший способ сделать это. Кстати, сложность значительно возрастает (возможно, экспоненциально, но я не уверен) для каждого добавленного дополнительного круга.
Это действительно интересная проблема, я помню, что видел это в классе геометрии средней школы, но так и не нашел решения. Если вы не можете найти ответ здесь, попробуйте опубликовать его на http://mathoverflow.net/ и пусть у математиков есть трещина: P –
как вы могли столкнуться с такой проблемой в жизни реального программиста? – zvolkov
иногда настоящие программисты нуждаются в реальной математике –