圆形相交,相切,相离,包含

来自BNU热身赛的一道几何题,个人感觉还行,毕竟Q神卡了7次才过去。。

E. School Flower

Time Limit: 1000ms

Memory Limit: 65536KB

64-bit integer IO format: %lld      Java class name: Main

Submit Status

学校的草坪上最近种满了漂亮的鲜花,为了给这些花朵浇水,学校购置了两个用于灌溉的喷头。每个喷头都有一个喷射半径,可以给喷射半径内的植物浇水。草坪上的有些花恰只能被一个喷头灌溉;可能还些花会被两个喷头同时灌溉,这些花会生长的更旺盛。

现在,ch0588想请你帮忙计算下,能同时被两个喷头灌溉的面积有多大?(下图中红色面积为所求)

(上图红色部分为所求面积)

Input

输入数据只有两行实数,用空格隔开

x1 y1 r1

x2 y2 r2

分别代表两个第i个喷头的位置(xi,yi),和它的喷射半径ri。

(0<xi,yi,ri<1000.0)

Output

输出一行,题目描述中的所求面积(保留两位小数)

Sample Input

1.0 3.0 3.0
1.0 8.0 4.0

Sample Output

6.64

Hint

π的值请取:3.1415926

解题思路:

  思路上没有什么难的,主要是讨论两个圆的各种位置关系,然后得到我们需要的结果。。。

相离和包含可以直接写,但是相交的话,要手推公式了。

代码:

 1 # include<cstdio>
 2 # include<iostream>
 3 # include<set>
 4 # include<cmath>
 5 # include<iomanip>
 6
 7 using namespace std;
 8
 9 # define PI 3.1415926
10
11 int main(void)
12 {
13     double x1,y1,r1;
14     double x2,y2,r2;
15     cin>>x1>>y1>>r1;
16     cin>>x2>>y2>>r2;
17
18     double s;
19     double r_ans = fabs(r2-r1);
20
21     double d = sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
22     if ( d >= r1+r2 )
23     {//相离
24         s = 0.00;
25     }
26     else if ( d <= r_ans )
27     {//内含
28         if ( r2 >= r1 )
29         {
30             s = PI*r1*r1;
31         }
32         else
33         {
34             s = PI*r2*r2;
35         }
36     }
37     else
38     {//相交
39         double a,aa;
40         double b,bb;
41         a = (r1*r1+(x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)-r2*r2)/(2*r1*d);
42         aa = 2*acos(a);
43         b = (r2*r2+(x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)-r1*r1)/(2*r2*d);
44         bb = 2*acos(b);
45         double s1 = r1*r1*sin(aa)/2;
46         double s2 = r2*r2*sin(bb)/2;
47         double s3 = r1*r1*aa/2;
48         double s4 = r2*r2*bb/2;
49         s = s3-s1+s4-s2;
50
51     }
52     printf("%.2f\n",s);
53
54
55
56
57
58     return 0;
59 }
时间: 2024-12-13 18:18:46

圆形相交,相切,相离,包含的相关文章

ACM学习历程——NOJ1113 Game I(贪心 || 线段树)

Description 尼克发明了这样一个游戏:在一个坐标轴上,有一些圆,这些圆的圆心都在x轴上,现在给定一个x轴上的点,保证该点没有在这些圆内(以及圆上),尼克可以以这个点为圆心做任意大小的圆,他想知道自己做多可以与多少个给定的圆相交(相切也算,包含不算). Input 输入有多组数据 输入到文件尾 每一组数据有一个整数n(1<=n<=100000),表示总共有n个圆. 接下是n行,每行两个整数xi,ri表示该圆的圆心坐标和半径. 接下来一行为一个整数x,表示尼克选取点的位置. x xi的范

C++003基础

1.C++对C的扩展 1简单的C++程序 1.1求圆的周长和面积 数据描写叙述: 半径.周长,面积均用实型数表示 数据处理: 输入半径 r. 计算周长 = 2*π*r : 计算面积 = π* r2 . 输出半径,周长,面积: 方法1:用结构化方法编程,求圆的周长和面积 // count the girth and area of circle #include<iostream.h> using name std; void main () { double r, girth, area ;

ZROI 19.08.02 计算几何

1.向量基础知识 \(atan2\)可以求极角,但是不是特别精确,在坐标接近\(10^{9}\)时会出锅,安全的做法是叉积. 旋转.反射和平移等都可以抽象为矩阵,即,它们可以复合.(需要一些必修四知识) 给一个序列,每个位置表示旋转.反射.平移中的一种,求\((x,y)\)经过序列\([l,r]\)的点. 线段树维护矩乘就好了,矩阵里需要带个常数位置. Simpson积分 不会积分,告辞. 2.简单题 求点\(p\)在直线\(p_1p_2\)上的投影. 投影就是点积,直接积就行了,必修四怎么学的

开源GIS简介

原文 开源GIS C++开源GIS中间件类库: GDAL(栅格)/OGR(矢量)提供了类型丰富的读写支持 GEOS(Geometry Engine Open Source)是基于C++的空间拓扑分析实现类库,遵循LGPL协议发布.GEOS类库提供了丰富的空间拓扑操作函数,用以判断几何对象间的相互关系,以及空间分析操作之后形成新的几何对象.点.线.面要素的两两相互关系,包括相合.分离.相交.重合.包含.相邻等不同位置关系,都可以通过GEOS类库中提供的函数进行分析和判断.并且GEOS类库提供了缓冲

地图投影系列介绍(三)----地图投影

4.地图投影     4.1 投影实质 将地球椭球面上的点映射到平面上的方法,称为地图投影. 为什么要进行投影? – 地理坐标为球面坐标,不方便进行距离.方位.面积等参数的量算. – 地球椭球体为不可展曲面. – 地图为平面,符合视觉心理,并易于进行距离.方位.面积等量算和各种空间分析.  投影的实质:经纬度坐标 -> 笛卡儿平面直角坐标系          建立地球椭球面上经纬线网和平面上相应经纬线网的数学基础,也就是建立地球椭球面上的点的地理坐标(λ,φ)与平面上对应点的平面坐标(x,y)之

QT 全貌一栏

QT QT使创建独立于平台的数据库应用成为可能. QT的内建驱动支持Oracle,Microsoft SQL Server,Sybase Adaptive Server,IBM DB2,PostgreSQL,MySQL,BorlandInterbase,SQLite,以及各种ODBC的数据库.QT的数据库功能完全集成到了QT设计器中,能提供数据库的生动的预览.QT包括专门的数据库组件,并且任何内建的或自定义的组件都可以数据相关: QT普遍使用Unicode并且有良好的国际化支持.QT包括QT L

Qt绘图之QGraphicsScene QGraphicsView QGraphicsItem详解(转)

Graphics View提供了一个界面,它既可以管理大数量的定制2D graphical items,又可与它们交互,有一个view widget可以把这些项绘制出来,并支持旋转与缩放.这个柜架也包含一个事件传播结构,对于在scene中的这些items,它具有双精度的交互能力. Items能处理键盘事件,鼠标的按,移动.释放.双击事件,也可以跟踪鼠标移动.Graphics View使用BSP树来提供对item的快速查找,使用这种技术,它可以实时地绘制大规模场景,甚至以百万items计.Grap

Path&amp;PathMeasure完全解析

前言 Path扮演着路径的角色,在绘制View起着非常重要的位置,而PathMeasure是对Path进行测量,通过使用PathMeasure可以更加方便的使用Path工具.网上都好多关于这方面的文章,在这里只是做个笔录,不好不要见怪.嘿嘿 Part 1.谈谈Path的使用 首先先分析方法 public class Path { /** * 空构造方法 */ public Path() { mNativePath = init1(); } /** * 重置Path */ public void

Bzoj3663/4660 CrazyRabbit

题意:给定平面上一个圆和一堆圆外的点,要求选出尽可能多的点使得它们之间两两连线都不和圆相交.保证任意两点连线不和圆相切.点数<=2000 这题是很久以前在某张课件上看见的.看了题解还搞了三小时,联赛滚粗既视感. 有个结论我是直接看的课件:"点和点连线不与圆相交"对应"这两个点所对的圆上的极角序区间相交但不相互包含",并不会证,画画图好像是对的. 在直线上选择一些两两相交且不包含的区间[L1,R1],[L2,R2],[L3,R3]-.,按左端点排序之后,必然有L