📚Description:
直角坐标系内现有两个半径相等的圆,问两圆的位置关系。
位置关系有:重合,相切,相离,相交;
若两圆相交,需要求出两圆的重叠面积。
⏳Input:
输入包含多组数据,每组数据为一行,包括5个实数x1,y1,x2,y2,r,分别代表第一个圆圆心的横纵坐标,第二个圆圆心的横纵坐标以及它们的半径,-20 < x1,y1,x2,y2,r < 20。
🔑Output:
对于每组数据,输出占一行,位置关系有:重合,相切,相离,相交,若两圆相交,则继续输出一个空格,再输出两圆的重叠面积,面积保留2位小数;
👨🏫 Sample Input:
0 0 0 0 1
0 0 1 0 0.5
0 0 1 0 0.3
0 0 1 0 1
💡Sample Output:
重合
相切
相离
相交 1.23
🙋思路
本题关键在于两个圆心距离和半径的对比
本题设置了两个半径相同的圆
简化了一定的难度
通过比较半径和圆心距离可以直接划分出四种状态
其中相交状态下需要计算面积
重叠面积具体介绍如下:
假设是半径为r的两个圆相交
因为半径相等,所以从各种情况都可以视为O1和O2在同一水平线上(为了方便计算)
且O1AO2B一定是一个菱形
接下来就是面积的计算
⭐重叠的面积其实就是两个扇形面积减去菱形面积⭐
📢📢📢 注意C语言中弧度与角度的转换!
📢📢📢 注意C语言中弧度与角度的转换!
📢📢📢 注意C语言中弧度与角度的转换!
AC Code
#include <stdio.h>
#include <math.h>
#define PI 3.1415926
int main(){
double x1,y1,x2,y2,r;
double len; //记录两个圆心的距离
while(scanf("%lf%lf%lf%lf%lf",&x1,&y1,&x2,&y2,&r)!=EOF){
float m; //角度
float s; //重合面积
len = sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
if(len == 2*r){ //相切
printf("相切\n");
}
else if(x1==x2 && y1==y2){ //重合
printf("重合\n");
}
else if(len > 2*r){ //相离
printf("相离\n");
}
else{ //相交
m = acos(0.5*len/r)*180.0/PI;
s = m/90*PI*r*r-r*sin(m*PI/180)*len;
printf("相交 %.2lf\n",s);
}
}
}