LightOJ 1118--Incredible Molecules(两圆相交)
| Time Limit: 0.5 second(s) | Memory Limit: 32 MB |
In the biological lab, you were examining some of the molecules. You got some interesting behavior about some of the molecules. There are some circular molecules, when two of them collide, they overlap with each other, and it's hard to find that which one is over the other one.
Given two molecules as circles, you have to find the common area of the given molecules that is shaded in the picture.

Overlapping Molecules
Input
Input starts with an integer T (≤ 12), denoting the number of test cases.
Each case contains six integers x1, y1, r1 and x2, y2, r2. Where (x1, y1) is the center of the first molecule and r1 is the radius and (x2, y2) is the center of the second molecule and r2 is the radius. Both the radiuses are positive. No integer will contain more than 3 digits.
Output
For each test case, print the case number and the common area of the given molecules. Errors less than 10-6 will be ignored.
Sample Input |
Output for Sample Input |
|
3 0 0 10 15 0 10 -10 -10 5 0 -10 10 100 100 20 100 110 20 |
Case 1: 45.3311753978 Case 2: 35.07666099 Case 3: 860.84369 |
首先,判断两圆关系,如果相交(两个交点),则求出相交的面积,外离和外切相交面积为0.
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
using namespace std;
const double PI = acos(-1.0);
typedef struct point {
double x;
double y;
point() { }
point(double a, double b) {
x = a;
y = b;
}
friend istream& operator >> (istream& in, point&b) {
in >> b.x >> b.y;
return in;
}
point operator -(const point &b)const {
return point(x - b.x, y - b.y);
}
point operator +(const point &b)const {
return point(x + b.x, y + b.y);
}
point operator *(const double &k)const {
return point(x * k, y * k);
}
point operator /(const double &k)const {
return point(x / k, y / k);
}
double operator ^(const point &b)const {
return x*b.y - y*b.x;
}
double operator *(const point &b)const {
return x*b.x + y*b.y;
}
}point;
typedef struct circle {
double r;
point centre;
friend istream& operator >> (istream &in, circle &b) {
in >> b.centre >> b.r;
return in;
}
double area() {
return PI*r*r;
}
}circle;
double dist(point p1, point p2) {
return sqrt((p1 - p2)*(p1 - p2));
}
void CircleInterArea(circle a, circle b, double &s1, double &s2) {//相交面积
double d = dist(a.centre, b.centre);//圆心距
double t = (d*d + a.r*a.r - b.r*b.r) / (2.0 * d);//
double h = sqrt((a.r*a.r) - (t*t)) * ;//h1=h2
double angle_a = * acos((a.r*a.r + d*d - b.r*b.r) / (2.0 * a.r*d));
//余弦公式计算r1对应圆心角,弧度
double angle_b = * acos((b.r*b.r + d*d - a.r*a.r) / (2.0 * b.r*d));
//余弦公式计算r2对应圆心角,弧度
double la = angle_a*a.r;//r1所对应的相交弧长
double lb = angle_b*b.r;//r2所对应的相交弧长
s1 = la*a.r / 2.0 - a.r*a.r*sin(angle_a) / 2.0; //相交部分r1圆的面积
s2 = lb*b.r / 2.0 - b.r*b.r*sin(angle_b) / 2.0; //相交部分r2圆的面积
//double rest_s1 = PI*a.r*a.r - s1 - s2;//r1圆剩余部分面积,不含相交部分面积
//double rest_s2 = PI*b.r*b.r - s1 - s2;//r1圆剩余部分面积,不含相交部分面积
}
//两圆关系
int CircleInterNum(circle a, circle b) {
double fh = fabs(a.r + b.r), fc = fabs(a.r - b.r), d = dist(a.centre, b.centre);
if (d>fh)
return -; //外离,没有交点
if (d == fh)
return -; //外切,一个交点
if (d > fc&&d < fh)
return ; //相交,两个交点
if (d == fc)
return ; //内切,一个交点
if (d < fc&&d >= )
return ; //内含,没有交点
}
int main(void) {
int t;
cin >> t;
for (int i = ; i <= t; i++) {
circle c1, c2;
double s1, s2;
cin >> c1 >> c2;
int f = CircleInterNum(c1, c2);
if (f == ) {
CircleInterArea(c1, c2, s1, s2);
printf("Case %d: %.8f\n", i, s1 + s2);
}
else if (f == - || f == -) {
printf("Case %d: 0\n", i);
}
else if (f == || f == ) {
printf("Case %d: %.8f\n", i,min(c1.area(),c2.area()));
}
}
return ;
}
LightOJ 1118--Incredible Molecules(两圆相交)的更多相关文章
- LightOJ 1118 - Incredible Molecules (两圆面积交)
1118 - Incredible Molecules PDF (English) Statistics Forum Time Limit: 0.5 second(s) Memory Limit: ...
- LightOj 1118 - Incredible Molecules(两圆的交集面积)
题目链接:http://lightoj.com/volume_showproblem.php?problem=1118 给你两个圆的半径和圆心,求交集的面积: 就是简单数学题,但是要注意acos得到的 ...
- POJ 2546 & ZOJ 1597 Circular Area(求两圆相交的面积 模板)
题目链接: POJ:http://poj.org/problem? id=2546 ZOJ:problemId=597" target="_blank">http: ...
- 两圆相交求面积 hdu5120
转载 两圆相交分如下集中情况:相离.相切.相交.包含. 设两圆圆心分别是O1和O2,半径分别是r1和r2,设d为两圆心距离.又因为两圆有大有小,我们设较小的圆是O1. 相离相切的面积为零,代码如下: ...
- 求两圆相交部分面积(C++)
已知两圆圆心坐标和半径,求相交部分面积: #include <iostream> using namespace std; #include<cmath> #include&l ...
- hdu5858 Hard problem(求两圆相交面积)
题目传送门 Hard problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ...
- poj2546Circular Area(两圆相交面积)
链接 画图推公式 这两种情况 都可用一种公式算出来 就是两圆都求出圆心角 求出扇形的面积减掉三角形面积 #include <iostream> using namespace std; # ...
- hdu 5120 (求两圆相交的面积
题意:告诉你两个圆环,求圆环相交的面积. /* gyt Live up to every day */ #include<cstdio> #include<cmath> #in ...
- [hdu 3264] Open-air shopping malls(二分+两圆相交面积)
题目大意是:先给你一些圆,你可以任选这些圆中的一个圆点作圆,这个圆的要求是:你画完以后.这个圆要可以覆盖之前给出的每一个圆一半以上的面积,即覆盖1/2以上每一个圆的面积. 比如例子数据,选左边还是选右 ...
随机推荐
- 拖动条SeekBar
1TextView tv=(TextView)findViewById(R.id.TV); 2 tv.setMovementMethod(ScrollingMovementMethod.getInst ...
- Java在Web开发语言上败给了PHP(转)
PHP的主要语言开发者之一.Zend公司的创始人之一Andi Gutmans最近在blog中直言不讳地批评了Java语言.他指出,目前Java厂商试图在JVM上提供动态语言实现的路子根本不对,Java ...
- python3 报错:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd6 in position 201: invalid continuation byte
代码: # -*- coding:utf-8 -*- from urllib import request resp = request.urlopen('http://www.xxx.com') p ...
- 我要为运维说一句,我们不是网管,好不!!Are you know?
运维 运维,这里指互联网运维,通常属于技术部门,与研发.测试.系统管理同为互联网产品技术支撑的4大部门,这个划分在国内和国外以及大小公司间都会多少有一些不同. 一个互联网产品的生成一般经历的过程是:产 ...
- SVN常用功能介绍(一)
简介 SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS. 互联网上很多版本控制服务已从CVS迁移到Subver ...
- js创建对象的几种方式 标签: javascript 2016-08-21 15:23 123人阅读 评论(0)
1.传统方法,创建一个对象,然后给这个对象创建属性和方法. var person = new Object(); person.name = "张三"; person.age = ...
- UML用例图间关系说明
用例间一般存在如下四种关系: 1."通信"关系(<<cmmunicate>>构造型): "通信"关系:使用实心的关联线或带<< ...
- c++由string组成的struct初始化崩溃
struct _UserInfo { string username; string password; string ip; string port; } _UserInfo str={}; 这样就 ...
- 类图(Rose) - Windows XP经典软件系列
版权声明:本文为xiaobin原创文章.未经博主同意不得转载. https://blog.csdn.net/xiaobin_HLJ80/article/details/24584625 ...
- BZOJ2179:FFT快速傅立叶(FFT)
Description 给出两个n位10进制整数x和y,你需要计算x*y. Input 第一行一个正整数n. 第二行描述一个位数为n的正整数x. 第三行描述一个位数为n的正整数y. Output 输出 ...
