题意 :

  • 给两个圆,分别代表得分区域和奖励区域,边长为a的正方形以均等概率扔到平面后绕中心旋转,保证一定会有某时刻正方形完全在得分区域内。
  • 如果某时刻正方形完全落在区域内,获得相应分数,求正方形 既获得得分又获得奖励的概率 比 正方形仅能获得得分 的比率。

思路 :

  • 要使正方形有可能被一个圆完全包含,它的中心轨迹一定是一个圆,所以本题就转化成了计算两圆相交面积 与 第一个圆面积 的比值。
  • 一些细节,数据中奖励区域不一定能完全包含正方形,以及两圆位置的不同情况(相离,包含,相交)要分类讨论。
  • 计算方法 :首先考虑两圆的位置关系,若为相交,用余弦定理求得三角形圆心处的角度,然后计算两个扇形的面积,再减去两个三角形的面积(即两对角线互相垂直的四边形面积),得到的恰好就是两圆相交部分的面积。

1.两圆相离:

判定条件:两圆半径之和大于等于圆心距

计算方法:显然相交面积为0

2.两圆相含:两圆半径之差小于等于圆心距

计算方法:显然相交面积为较小圆的面积

3.两圆相交:以上两种情况以外

计算中使用到的公式 :

  • cos是余弦函数,acos是求反余弦
  • 余弦定理 cosß=a2+b2−c22abcosß = \frac{a^2 + b^2 - c^2}{2a b}cosß=2aba2+b2−c2​
  • 扇形面积(利用角度) S=12αr2S=\frac{1}{2}\alpha r^2S=21​αr2
  • 两对角线互相垂直的四边形面积 S=12×积S=\frac{1}{2} \times {积}S=21​×积
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <vector>
#include <unordered_map>
#include <unordered_set>
#include <set>
#include <map>
#define endl '\n'
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)
using namespace std;
const double pi = acos(-1);
typedef long long ll;struct point
{double x, y;
};double calc(point a, double r1, point b, double r2)
{double dist = sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));if (r1 + r2 <= dist) return 0;if (r1 > r2) swap(r1, r2);if (r2 - r1 >= dist) return pi * r1 * r1;double ang1 = acos((r1 * r1 + dist * dist - r2 * r2) / (2.0 * r1 * dist));double ang2 = acos((r2 * r2 + dist * dist - r1 * r1) / (2.0 * r2 * dist));return ang1 * r1 * r1 + ang2 * r2 * r2 - dist * r1 * sin(ang1);
}int main()
{int T;scanf("%d", &T);while (T -- ){double r1, x1, y1, r2, x2, y2, aa;scanf("%lf%lf%lf%lf%lf%lf%lf", &r1, &x1, &y1, &r2, &x2, &y2, &aa);if (r1 * r1 - aa * aa / 4 <= 0 || r2 * r2 - aa * aa / 4 <= 0){cout << "0.000000" << endl;continue;}point a = {x1, y1}, b = {x2, y2};double r3 = sqrt(r1 * r1 - aa * aa / 4) - aa / 2, r4 = sqrt(r2 * r2 - aa * aa / 4) - aa / 2;double res = calc(a, r3, b, r4);printf("%.6lf\n", res / (pi * r3 * r3));}return 0;
}

Square Card 计算几何-两圆相交面积相关推荐

  1. 求两圆相交面积(模板)

    两圆相交分如下集中情况:相离.相切.相交.包含. 设两圆圆心分别是O1和O2,半径分别是r1和r2,设d为两圆心距离.又因为两圆有大有小,我们设较小的圆是O1. 相离相切的面积为零,代码如下: dou ...

  2. 求任意两圆相交的面积(不限程序设计语言版本)

    无所谓程序设计语言,不过是表达形式不一罢了 题目来源 理论知识 参考知识: 代码实现 C# 鼠标悬停此处预览测试样例 Java 鼠标悬停于此预览测试样例 Kotlin C++ C Python Jav ...

  3. 两圆相交求面积 hdu5120

    转载 两圆相交分如下集中情况:相离.相切.相交.包含. 设两圆圆心分别是O1和O2,半径分别是r1和r2,设d为两圆心距离.又因为两圆有大有小,我们设较小的圆是O1. 相离相切的面积为零,代码如下: ...

  4. python求交点坐标_Python - 两圆相交求交点坐标

    Python - 两圆相交求交点坐标 Max.Bai 2016-05-16 Python - 两圆相交求交点坐标 三轴机械臂求坐标问题,其实转化为平面问题就是两圆相交求交点问题,交点算出来就可以用反三 ...

  5. 【计算几何】圆的面积并

    总之,圆的面积并是一个非常漂亮的算法,虽然说好像没有很强的扩展性以及实用性,但确实训练自己计算几何代码能力的好题目. 一下皆蒯自栗师<圆的并>解题报告: 试想,如果人来做此题,而不使用计算 ...

  6. 求解两圆相交的交点坐标

    今天遇到了一个问题,要求两个相交圆的交点坐标,用了三种不同方法求解,其中纯代数方法求解比较麻烦,这里没有贴出来.暂时只推导了公式,明天再写程序,程序写好后会更新到博客,如果大家有其它的方法,欢迎一起探 ...

  7. 求两圆相交的交点的方法

    最近研究三角定位算法,研究了下怎样求两圆的交点,现给出求解方法:

  8. hdu 3264(二分+圆相交面积)

    题意:给出一些圆,选择其中一个圆的圆心为圆心,然后画一个大圆,要求大圆最少覆盖每个圆的一半面积.求最小面积. 解题思路:首先枚举每个圆,以其圆心作为大圆的圆心,然后再用二分去寻找最小的半径. #inc ...

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

    心理阴影 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 自从shanghai reginal后,zkc学长的心理就有了阴影.什么不敢水题,不敢gj,不敢放松...(各种 ...

最新文章

  1. HDU 1540 Tunnel Warfare
  2. Numpy实现BP神经网络(包含Dropout、BN等训练技巧)
  3. LVS负载均衡群集(LVS-NAT搭建)
  4. 通过Main的Checkpoint Restore加快Java启动速度
  5. 保存您的lambda,以备不时之需-保存到文件
  6. 计算机科学中的研究成果,田聪教授团队科研成果在计算机科学顶会LICS 2020发表...
  7. 窗体应用程序:四则运算
  8. JetBrains系列WebStorm等中文输入法无法跟随光标的问题的解决办法
  9. D进制A+B(20)
  10. qtcreator安装及配置
  11. WebService的简单示例
  12. 2. HTTP 报文
  13. OpenCV提取图书条码(ISBN码)
  14. EtherCAT工业以太网的主要特点
  15. python名字起源_你知道这些编程语言名字的由来吗
  16. 整合ecshop与discuz论坛
  17. Bzoj4556: [Tjoi2016Heoi2016]字符串
  18. java面试宝典:留着慢慢看
  19. c语言编辑三色球问题,C语言实例编程:三色球问题
  20. [杀鸡用鸡刀]扯谈“快准狠”的去服务化商业模式

热门文章

  1. SAP固定资产期初导入检查
  2. SAP FICO与金蝶财务软件的区别
  3. ABAP性能优化之使用 “for all entries”
  4. AgilePoint商业流程管理平台
  5. 想用一张报表满足多人需求?只需这3招,轻松实现0到100分新突破
  6. 行业「趋轻」,尚美“共创品牌”推动酒店业进入春天
  7. linux线程调度函数,Linux调度策略及线程优先级设置
  8. 操作系统都是用c语言写的吗,用C语言写关于操作系统的一个问题。
  9. 接收请求处理流程_从Tomcat入口了解Spring MVC的请求处理流程(2)问题答疑
  10. linux服务器无网络确认,Linux服务器故障排查实用指南