NYOJ 1186 心理阴影(两个圆环的相交面积)
生活随笔
收集整理的這篇文章主要介紹了
NYOJ 1186 心理阴影(两个圆环的相交面积)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
心理陰影
時間限制:1000?ms ?|? 內(nèi)存限制:65535?KB 難度:2 描述????? 已知一個人的心理陰影為一個環(huán)形,那么求你們的zkc學(xué)長和zjs學(xué)長站在一起的時候的心理陰影的重疊面積。
輸入
r,R表示是內(nèi)圓半徑和外圓半徑。
x1,y1 zkc學(xué)長站的位置(抽象為一個點)
x2,y2 zjs學(xué)長站的位置(也抽象為一個點)
ps:k,第k組數(shù)據(jù)。y,你們的zkc學(xué)長和zjs學(xué)長站在一起的時候的心理陰影的重疊面積。
經(jīng)分析可得:
兩個圓環(huán)的相交面積 = 圓環(huán)1外圓和圓環(huán)2外圓的相交面積 - 圓環(huán)1外圓和圓環(huán)2內(nèi)圓的相交面積 - 圓環(huán)1內(nèi)圓和圓環(huán)2外圓的相交面積 + 圓環(huán)1內(nèi)圓和圓環(huán)2內(nèi)圓的相交面積。
#include <cstdio> #include <cmath> using namespace std;#define PI acos(-1.0) //定義PIstruct Circle { // 定義圓double x, y;double r; };struct Ring { // 定義圓環(huán)double x, y;double R, r; };struct Get_Intersection_RingAndRing {//求圓心距,即兩個圓心之間的距離double get_dis(double x1, double y1, double x2, double y2) {return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));}// 求兩圓的相交面積double get_CircleIntersectionArea(Circle c1, Circle c2) {double dis = get_dis(c1.x, c1.y, c2.x, c2.y);// 圓心距大于半徑和,兩圓相交面積為0if(dis >= c1.r + c2.r) return 0;double min_r = c1.r < c2.r ? c1.r : c2.r;double max_r = c1.r > c2.r ? c1.r : c2.r;if(min_r + dis <= max_r) //圓心距小于半徑之差,兩圓包含關(guān)系return PI * min_r * min_r;double a = acos((c1.r * c1.r + dis * dis - c2.r * c2.r) / 2 / c1.r / dis);double b = acos((c2.r * c2.r + dis * dis - c1.r * c1.r) / 2 / c2.r / dis);double area1 = a * c1.r * c1.r; //第一個圓中扇形的面積, 弧長L=a*c1.r,面積等于0.5*L*c1.rdouble area2 = b * c2.r * c2.r; //第二個圓中扇形的面積double ans = area1 + area2; //兩個扇形的面積和等于四邊形的面積加上兩圓相交的面積double area_qua = sin(a) * c1.r * dis; //四邊形的面積ans -= area_qua;return ans;}//求圓環(huán)和圓環(huán)的相交面積double Get_IntersectionArea(Ring r1, Ring r2) {Circle a1, a2, b1, b2;a1.x = r1.x, a1.y = r1.y, a1.r = r1.r;a2.x = r1.x, a2.y = r1.y, a2.r = r1.R;b1.x = r2.x, b1.y = r2.y, b1.r = r2.r;b2.x = r2.x, b2.y = r2.y, b2.r = r2.R;return get_CircleIntersectionArea(a2, b2) - get_CircleIntersectionArea(a1, b2) - get_CircleIntersectionArea(a2, b1) + get_CircleIntersectionArea(a1, b1);} };int main() {int T;Ring r1, r2;Get_Intersection_RingAndRing x;scanf("%d", &T);for(int cas = 1; cas <= T; cas++) {scanf("%lf%lf", &r1.r, &r1.R);r2.r = r1.r, r2.R = r1.R;scanf("%lf%lf%lf%lf", &r1.x, &r1.y, &r2.x, &r2.y);printf("Case #%d: %.5lf\n", cas, x.Get_IntersectionArea(r1, r2));}return 0; }
總結(jié)
以上是生活随笔為你收集整理的NYOJ 1186 心理阴影(两个圆环的相交面积)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: NoSuchMethodError 常见
- 下一篇: 速看!上班后如何做好防护?这9点一定要知