給定兩個圓,求其覆蓋的面積,其實也就是求其公共面積(然後用兩圓面積和減去此值即得最後結果)。
我一開始是用計算幾何的方法做的,結果始終不過。**如下:
/*根據後來的除錯,應該是對如下圖b的情況處理不正確。* author : ben */
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
const
double pi = acos(-1
);typedef
struct
mypoint
} mypoint;
inline
double mydistance2(const mypoint &p1, const mypoint &p2)
inline
double mydistance(const mypoint &p1, const mypoint &p2)
mypoint intersection(mypoint u1, mypoint u2, mypoint v1, mypoint v2)
void intersection_line_circle(mypoint c, double
r, mypoint l1, mypoint l2,
mypoint& p1, mypoint&p2)
void intersection_circle_circle(mypoint c1, double r1, mypoint c2, double
r2, mypoint& p1, mypoint&p2)
intmain()
else
if (dis <= fabs(r1 - r2))
else
printf(
"%.6f\n
", ans);
}return0;
}
於是後來上網找了幾個中學的解析幾何公式,終於a了。
做法是聯立兩個圓的方程(相減),得到相交弦所在直線方程,然後用點到直接的距離公式得到h1和h2,接著算出θ1和θ2,然後就能求得三角形的面積和扇形的面積了。一開始我以為需要分類討論上面圖a和圖b兩種情況,後來發現,直接去掉求距離時的取絕對值運算就可以了,因為距離為負的時候,得到的夾角也是負的,這樣求的三角形面積是負的,扇形也是原先的相補的那部分,具體的圖我就不畫了,很容易想明白的。
ac**如下:
/** author : ben */
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
const
double pi = acos(-1
);typedef
struct
mypoint
} mypoint;
inline
double mydistance2(const mypoint &p1, const mypoint &p2)
intmain()
else
if (dis <= fabs(r1 - r2))
else
printf(
"%.6f\n
", ans);
}return0;
}
模版 兩圓相交部分面積
題目 poj 2546 circular area 題意 計算兩圓公共部分面積 260k 0ms g 提交wa,c 提交ac o o include include include include include include using namespace std const double ep...
兩圓相交求相交面積
1.海 式 2.余弦公式cosa public double areaofintersectionofcircles int firstx,int firsty,int firstr,int secondx,int secondy,int secondr alpha math.acos d d fi...
求兩圓交集的面積
設圓c1 半徑為r1 面積為s1 圓cr 半徑為 r2 面積為s2 圓心距離為d 兩圓的交集有3種情況 1 兩圓交面積為0的情況 即 d r1 r2 2 小圓內含含於大圓的情況 即 max r1,r2 d min r1,r2 3 兩圓相交的情況 即 d r1 r2 且 d max r1,r2 對於第...