博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ZOJ 3058 Circle and Ring【圆与环相交面积】【圆与圆相交面积模板】
阅读量:6672 次
发布时间:2019-06-25

本文共 2247 字,大约阅读时间需要 7 分钟。

Circle and Ring

Time Limit: 1 Second      
Memory Limit: 32768 KB

Given a circle and a ring, your task is to calculate the area of their intersection.

Input

This problem contains multiple test cases, process to the end of file.

For each case, there are two lines. The first line contains three real numbers x'y' and r' (0 <= r' <= 1024) representing the circle. The second line contains four real numbers xyr and R (0 <= r <= R <= 1024) representing the ring.

Output

For each case, output the area with the accuracy of three digits after decimal point in a signal line.

Never output "-0.000"!

Sample Input

10 0 20-10 0 10 2020 30 1540 30 0 30

Sample Output

351.041608.366

Author: 
WU, Zejun

Source: 
ZOJ Monthly, November 2008

 

题意:给出一个圆的圆心坐标和半径,以及一个圆环的坐标和内外圆的半径,求这个圆和圆环的相交面积。

经分析可得,一共有如下几种情况:

通过计算可得出:

圆和圆环的相交面积 = 圆和圆环中大圆的相交面积 - 圆和圆环中小圆的相交面积。

#include 
#include
#include
#include
#include
#include
#include
using namespace std;const int maxn = 100010;const double pi = acos(-1.0);struct point { double x, y;};double x1, y11, r1, x2, y2, r2, R2;double D(point a, point b) //两点间距离{ return sqrt((a.x - b.x)*(a.x - b.x) + (a.y - b.y)*(a.y - b.y));}double calc(point a, double r1, point b, double r2) //计算面积{ double d = D(a, b); double cosaa = (r1*r1 + d*d - r2*r2) / (2 * r1*d); double cosa = acos(cosaa); double l = r1*cosa * 2; double s = l*r1 / 2; double s2 = r1*r1*sin(cosa)*cos(cosa); return s - s2;}bool ainb(point a, double r1, point b, double r2) //判断a是否在b中{ double d = D(a, b); if (d <= r2 - r1) return 1; return 0;}bool ainstb(point a, double r1, point b, double r2) //判断a和b是否有相交的区域{ double d = D(a, b); if (d >= fabs(r1 - r2) && d <= r1 + r2) return 1; return 0;}double S(point a, double r1, point b, double r2) //计算相交面积{ if (ainb(a, r1, b, r2)) return pi*r1*r1; if (ainb(b, r2, a, r1)) return pi*r2*r2; if (!ainstb(a, r1, b, r2)) return 0; return calc(a, r1, b, r2) + calc(b, r2, a, r1);}int main(){ point a, b; double r1, r2, r3; while (~scanf("%lf%lf%lf", &a.x, &a.y, &r1)) { scanf("%lf%lf%lf%lf", &b.x, &b.y, &r2, &r3); printf("%.3f\n", S(a, r1, b, r3) - S(a, r1, b, r2)); } return 0;}

转载于:https://www.cnblogs.com/Archger/p/8451592.html

你可能感兴趣的文章
三招教你如何选择企业网盘
查看>>
轻量函数式 JavaScript:一、为什么要进行函数式编程?
查看>>
替代SSD?Crossbar进军中国存储市场
查看>>
红杉计越:AI、大数据、SaaS、云计算为何在中国一体迸发?
查看>>
阿里张勇:数据驱动的透明是平台治理的基础
查看>>
ActiveMQ - JMS,Transport,Persistence
查看>>
互联网大数据支撑生态银行建设
查看>>
视频会议系统迎来第四次浪潮
查看>>
报告显示:被调研中国企业超85%已从数字转型中获得回报
查看>>
东方日升拉美光伏电站项目 将进入首期施工
查看>>
软件探索性测试 笔记二
查看>>
将来也不会被破译的分布式存储系统
查看>>
光伏电站或成辅助服务市场“输家”
查看>>
今年光伏“领跑者”计划将升级扩围
查看>>
Java程序运行超时后退出或进行其他操作的实现
查看>>
手把手教你启用RemoteFX以及Hyper-V GPU卸载
查看>>
《交互式程序设计 第2版》一3.10 更进一步
查看>>
英伟达发布Tesla P4&P40两款基于Pascal架构的深度学习芯片
查看>>
《ANSYS Workbench有限元分析实例详解(静力学)》——2.5 Windows界面相应操作
查看>>
《代码整洁之道:程序员的职业素养》一一1.3 首先,不行损害之事
查看>>