欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

NYOJ 1186 心理阴影(两个圆环的相交面积)

发布时间:2025/3/16 编程问答 35 豆豆
生活随笔 收集整理的这篇文章主要介绍了 NYOJ 1186 心理阴影(两个圆环的相交面积) 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

心理阴影

时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述
自从shanghai reginal后,zkc学长的心理就有了阴影。什么不敢水题,不敢gj,不敢放松...(各种不敢)。同样的你们的zsj学长也是这样的。并且他们的心理阴影是一样一样的。
      已知一个人的心理阴影为一个环形,那么求你们的zkc学长和zjs学长站在一起的时候的心理阴影的重叠面积。
输入
T组数据
r,R表示是内圆半径和外圆半径。
x1,y1 zkc学长站的位置(抽象为一个点)
x2,y2 zjs学长站的位置(也抽象为一个点)
输出
Case #k: y
ps:k,第k组数据。y,你们的zkc学长和zjs学长站在一起的时候的心理阴影的重叠面积。
样例输入
2 2 3 0 0 0 0 2 3 0 0 5 0
样例输出
Case #1: 15.70796 Case #2: 2.25078

经分析可得:

两个圆环的相交面积 = 圆环1外圆和圆环2外圆的相交面积 - 圆环1外圆和圆环2内圆的相交面积 - 圆环1内圆和圆环2外圆的相交面积 + 圆环1内圆和圆环2内圆的相交面积。

#include <cstdio> #include <cmath> using namespace std;#define PI acos(-1.0) //定义PIstruct Circle { // 定义圆double x, y;double r; };struct Ring { // 定义圆环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) //圆心距小于半径之差,两圆包含关系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;}//求圆环和圆环的相交面积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; }


总结

以上是生活随笔为你收集整理的NYOJ 1186 心理阴影(两个圆环的相交面积)的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。