如何計算n個圓的聯集面積
如何計算n個圓的聯集面積
前言
一般人第一次遇到這個問題,可能會想要想辦法用排容原理,找圓之間交疊的凸包之類的…。
然而我只要舉一個例子,你就會發現我們就算把凸包找出來了,我們也非常難知道找到的凸包到底是要減掉還是要加上這個面積。
來源
我們會發現包含中空的那個四邊形,我們不容易知道到底那塊要不要加上。
觀看更多正版原始文章請至petjelinux的blog
想法
我們可以利用線積分,對圓的聯集的邊界逆時鐘積分,就可以得到面積。
首先我們需要得到邊界,也就是沒有被別的圓包含的圓弧。要得到這個我們可以對於某個圓\(c_i\)去遍歷所有別的圓\(c_j,i\neq j\),把交疊得到的圓弧記下來,那麼沒被記下來的圓弧就是我們要積分的部分了。
對於圓\(a,b\),我們只需要考慮三種狀況(\(d=|a.center-b.center|\)):
- same(a.radius+b.radius,d)
- d<=abs(a.radius-b.radius)+eps
- d<abs(a.radius+b.radius)-eps
接著我們可以利用\(d,a.radius,b.radius\)和餘弦定理來計算圓弧的角度範圍(以平行\(x\)軸為角度\(0\))。
接著我們來看對於一個圓\(c_i\),圓心在\((x_0,y_0)\),對於圓弧\([0,\theta]\)積分所得到的值:
\(\int_\Gamma