计算两圆相交面积 您所在的位置:网站首页 origin求交点间包围的面积 计算两圆相交面积

计算两圆相交面积

2024-06-30 01:49| 来源: 网络整理| 查看: 265

转自:[模板] 求两圆相交面积(模板) 

两圆相交分如下集中情况:相离、相切、相交、包含。

设两圆圆心分别是O1和O2,半径分别是r1和r2,设d为两圆心距离。又因为两圆有大有小,我们设较小的圆是O1。

相离相切的面积为零,代码如下:

double d = sqrt((a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y)); if (d >= r1+r2) return 0;

包含的面积就是小圆的面积了,代码如下:

if(r2 - r1 >= d) return pi*r1*r1;

接下来看看相交的情况。

 

相交面积可以这样算:扇形O1AB - △O1AB + 扇形O2AB - △O2AB,这两个三角形组成了一个四边形,可以用两倍的△O1AO2求得,

所以答案就是两个扇形-两倍的△O1AO2

因为

所以

那么

同理

接下来是四边形面积:

代码如下:

double ang1=acos((r1*r1+d*d-r2*r2)/(2*r1*d)); double ang2=acos((r2*r2+d*d-r1*r1)/(2*r2*d)); return ang1*r1*r1 + ang2*r2*r2 - r1*d*sin(ang1);

至此完整代码就可以写出来了:

#include #include using namespace std; #define pi acos(-1.0) typedef struct node { int x; int y; }point; double AREA(point a, double r1, point b, double r2) { double d = sqrt((a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y)); if (d >= r1+r2) return 0; if (r1>r2) { double tmp = r1; r1 = r2; r2 = tmp; } if(r2 - r1 >= d) return pi*r1*r1; double ang1=acos((r1*r1+d*d-r2*r2)/(2*r1*d)); double ang2=acos((r2*r2+d*d-r1*r1)/(2*r2*d)); return ang1*r1*r1 + ang2*r2*r2 - r1*d*sin(ang1); } int main() { point a, b; a.x=2, a.y=2; b.x=7, b.y=2; double result = AREA(a, 3, b, 5); printf("%lf\n", result); return 0; }

 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有