hdu6354 圓的相交

2022-06-02 04:06:08 字數 3020 閱讀 1160

題目大意:

給定m r 初始圓盤以原點為圓心半徑為r

給定m個圓的圓心(x,y) 半徑r 保證m個圓互不相交且不會覆蓋圓盤

用這m個圓來切割初始的圓盤求最後圓盤外圍的長度

求圓與圓盤的交點

減去圓盤上兩點間的周長 加上圓上兩點間的周長 判斷一下方向

#include using

namespace

std;

#define inf 0x3f3f3f3f

#define ll long long

#define pi acos(-1)

#define pb(a) push_back(a)

#define mem(i,j) memset(i,j,sizeof(i))

const

int n=1e5+5

;const

int mod=1e9+7

;const

double eps=1e-8

;double add(double a,double

b) int dcmp(double

x) struct

p p(

double _x,double

_y):x(_x),y(_y){}

p operator - (p p)

p operator + (p p)

p operator * (double d)

p operator / (double d)

double dot (p p)

double det (p p)

bool

operator == (const p& p)const

bool

operator

< (const p& p)const

};struct

l l(p _p,p _v):p(_p),v(_v)

p acp(

double t)

};struct

c c(p _p,

double

_r):p(_p),r(_r){}

p acp(

double a)

double al(double ang)

}c;//

求向量a的長度

double lenp(p a)

//求向量v極角

double angle(p v)

//求兩向量夾角

double angle(p u,p v)

/*判斷兩圓相交

求圓c1與c2的交點 並用s儲存交點

w記錄是外切1還是內切-1

*/int inscc(c c1,c c2,vector& s,int*w)

if((c1.r+c2.r-d)

0; //

外離if(d-abs(c1.r-c2.r)

0; //

內離(*w)=dcmp(d-c1.r);

double ang=angle(c2.p-c1.p); //

向量c1c2求極角

double da=acos((c1.r*c1.r+d*d-c2.r*c2.r)/(2*c1.r*d));

//c1與交點的向量 與 c1c2 的夾角

p p1=c1.acp(ang-da), p2=c1.acp(ang+da); //

求得兩交點

s.pb(p1);

if(p1==p2) return

1; //

同乙個點

s.pb(p2); return2;

}int

main()

else

if(s==2

) }

printf(

"%.10f\n

",ans);

}return0;

}

view code

也可以用餘弦定理 

#include using

namespace

std;

#define inf 0x3f3f3f3f

#define ll long long

#define pi acos(-1)

#define pb(a) push_back(a)

#define mem(i,j) memset(i,j,sizeof(i))

const

int n=1e5+5

;const

int mod=1e9+7

;const

double eps=1e-8

;double add(double a,double

b) int dcmp(double

x) struct

p p(

double _x,double

_y):x(_x),y(_y){}

p operator - (p p)

p operator + (p p)

p operator * (double d)

p operator / (double d)

double dot (p p)

double det (p p)

bool

operator == (const p& p)const

bool

operator

< (const p& p)const

};struct

c c(p _p,

double

_r):p(_p),r(_r){}

p acp(

double a)

double al(double ang)

}c;//

求向量a的長度

double lenp(p a)

double

change(c t)

intmain()

printf(

"%.10f\n

",ans);

}return0;

}

view code

hdu 5120(2014北京 求圓相交)

題意 求環的相交面積 思路 通過畫圖可知,面積 大圓相交面積 大小圓相交面積 2 小小圓相交面積 再通過圓相交模板計算即可 include include include include include using namespace std typedef long long ll define ...

hdu5012 圓環相交面積

題中給了 兩個同心圓,乙個大圓乙個小圓,然後再給了乙個大圓乙個小圓也是同心圓,求這兩個圓環相交的面積,用兩個大圓面積減去兩倍大小圓面積交加上兩個小圓面積交,就ok了 這裡算是坑明白了 使用acos的時候要保證不能讓大於1或者小於 1的數進來,因此加乙個判斷,在現場的時候就是這裡被坑死了 includ...

HDU 3264 求兩圓相交的面積

此題意很簡單,思路也容易想到。但是我就是卡在了求兩圓相交求面積的地方。還好現在有了模板了。不說了,直接貼 還得多多總結,二分真的很好用,要學會用啊!include include include includeusing namespace std define inf 2147483647 def...