題中給了 兩個同心圓, 乙個大圓乙個小圓,然後再給了乙個大圓乙個小圓也是同心圓,求這兩個圓環相交的面積,用兩個大圓面積減去兩倍大小圓面積交加上兩個小圓面積交,就ok了
這裡算是坑明白了 使用acos的時候要保證不能讓大於1或者小於-1的數進來,因此加乙個判斷,在現場的時候就是這裡被坑死了
#include #includeview code#include
#include
#include
using
namespace
std;
const
double epl =0.0000000001
;const
double pi=acos(-1.0
);struct
point
};struct
circle
}p1,p2,c1,c2;
int dcmp(double
x)double myz(double
a)point
operator -(point a, point b)
bool
operator ==(point a, point b)
double
dot(point a, point b)
double
length(point a)
double
angle(point a, point b)
double
angle(point v)
int getdd(circle c1, circle c2, point &p1, point &p2)
if(dcmp(c1.r+c2.r-d)<=0) return1;
if(dcmp(fabs(c1.r-c2.r)-d)>=0) return0;
double a=angle(c2.c-c1.c);
double da=acos((c1.r*c1.r+d*d-c2.r*c2.r)/(2*c1.r*d) );
p1= c1.p(a-da),p2=c1.p(a+da);
if(p1==p2)return1;
return2;
}double
cross(point a, point b)
double
area(point a, point b, point c)
double
solve(circle a, circle b)
if(dcmp(a.r-b.r)==0
)else
if(dcmp(cross(pp1-pp2,a.c-pp2) )*dcmp(cross(pp1-pp2,b.c-pp2))>=0
)else
}}int
main()
return0;
}
HDU 6158 圓的反演
注意由於反演 中具有一一對應的性質,只有原來相交的點到後面才會可能相交,剩下的就是圓的反演了 這個東西沒有模版 還有我們用反演變換的時候一般關注兩個東西,乙個是過反演中心的圓 因為這種圓的反形是一條直線 另一種情況我們關注不過反演中心的直線,因為這個的反形是圓。也一般在這種情況下我們才使用反演變換 ...
hdu6354 圓的相交
題目大意 給定m r 初始圓盤以原點為圓心半徑為r 給定m個圓的圓心 x,y 半徑r 保證m個圓互不相交且不會覆蓋圓盤 用這m個圓來切割初始的圓盤求最後圓盤外圍的長度 求圓與圓盤的交點 減去圓盤上兩點間的周長 加上圓上兩點間的周長 判斷一下方向 include using namespace std...
hdu6158(圓的反演)
初始有兩個圓,按照標號去放圓,問放完 n 個圓後的總面積。圓的反演的應用。參考blog 設反演圓心為 o 和反演半徑 r 圓的反演的定義 已知一圓 c 圓心為 o 半徑為 r 如果 p 與 p 在過圓心 o 的直線上且 op cdot op r 2 則稱 p 與 p 關於 o 互為反演點。有圓的反演...