目录

  • 公式
  • 推导
  • 代码

公式

两球相交分为两种情况:
第一种 大球完全包围了小球
第二种 两球相交但无完全包含关系

第一种情况的答案是显而易见的,直接求出小球体积即可
下面给出第二种情况的求解方法

V = π h 1 2 ( R − 1 3 h 1 ) + π h 2 2 ( r − 1 3 h 2 ) V = \pi h_1^2(R-\frac{1}{3}h_1) + \pi h_2^2(r-\frac{1}{3}h_2) V=πh12​(R−31​h1​)+πh22​(r−31​h2​)
图中角 α \alpha α与角 β \beta β位置标反了(多谢评论区小伙伴的提醒)

推导

我们把相交部分面积分为两部分,一部分是大球刨出去的体积,一部分是小球抛出去的体积,并且这两部分面积计算公式相同。
接下来我们证明其中大球刨去体积的公式。
先做一些准备工作
cos ⁡ α = R 2 + d 2 − r 2 2 R d \cos\alpha = \frac{R^2+d^2-r^2}{2Rd} cosα=2RdR2+d2−r2​
h 1 = R − R c o s α h_1 = R-Rcos\alpha h1​=R−Rcosα
为了应用黎曼积分求体积,首先要得到大球被抛去部分的圆面面积公式。
由于刨去部分圆面的半径随着圆面的圆心从E点到F点的距离变小而变小,为了研究这两者间的关系,我们设圆面的圆心到F点的距离为 x x x 。
得到圆面半径的表达式为 R 2 − ( R c o s α + x ) 2 ) \sqrt{R^2-(Rcos\alpha+x)^2}) R2−(Rcosα+x)2 ​) ,从而圆面面积表达式为 π ( R 2 − ( R c o s α + x ) 2 ) \pi(R^2-(Rcos\alpha+x)^2) π(R2−(Rcosα+x)2)
于是得到大球抛去体积 V 1 V_1 V1​ 的积分公式为
V 1 = ∫ 0 h 1 π ( R 2 − ( R c o s α + x ) 2 ) d x V_1 = \int_0^{h_1}\pi(R^2-(Rcos\alpha+x)^2) dx V1​=∫0h1​​π(R2−(Rcosα+x)2)dx
经过一系列牛顿-莱布尼茨公式之后化简得到
V 1 = π ( − 1 3 h 1 2 − R h 1 2 c o s α + R 2 h 1 s i n 2 α ) V_1 = \pi(-\frac{1}{3}h_1^2-Rh_1^2cos\alpha+R^2h_1sin^ 2\alpha) V1​=π(−31​h12​−Rh12​cosα+R2h1​sin2α)
再把 c o s α cos\alpha cosα 代入化简后得到
V 1 = π h 1 2 ( R − 1 3 h 1 ) V_1 = \pi h_1^2(R-\frac{1}{3}h_1) V1​=πh12​(R−31​h1​)
同理可得小球被刨去的体积
V 2 = π h 2 2 ( r − 1 3 h 2 ) V_2 = \pi h_2^2(r-\frac{1}{3}h_2) V2​=πh22​(r−31​h2​)
总体积
V = V 1 + V 2 = π h 1 2 ( R − 1 3 h 1 ) + π h 2 2 ( r − 1 3 h 2 ) V = V_1 + V_2 = \pi h_1^2(R-\frac{1}{3}h_1) + \pi h_2^2(r-\frac{1}{3}h_2) V=V1​+V2​=πh12​(R−31​h1​)+πh22​(r−31​h2​)

代码

话不多说,上代码

#include<iostream>
#include<cmath>
#define Pi 3.14using namespace std;class Sphere //属性分别为:(x,y,z)三个坐标以及半径
{private:double m_x;double m_y;double m_z;double m_r;
public:Sphere():m_x(0),m_y(0), m_z(0), m_r(0){}Sphere(double x,double y,double z,double r) :m_x(x), m_y(y), m_z(z), m_r(r){}double getx();double gety();double getz();double getr();void modi_x(double x);void modi_y(double y);void modi_z(double z);void modi_r(double r);bool intersect(Sphere& o);double vol_ints(Sphere& o);double distance(Sphere& o);
};
//获得属性
double Sphere::getx()
{return m_x;
}
double Sphere::gety()
{return m_y;
}
double Sphere::getz()
{return m_z;
}
double Sphere::getr()
{return m_r;
}
//修改属性
void Sphere::modi_x(double x)
{m_x = x;
}
void Sphere::modi_y(double y)
{m_y = y;
}
void Sphere::modi_z(double z)
{m_z = z;
}
void Sphere::modi_r(double r)
{m_r = r;
}
//判断两个球是否相交
bool Sphere::intersect(Sphere& o)
{if (m_x == o.m_x && m_y == o.m_y && m_z == o.m_z)return true;else{double dis = distance(o);if ((m_r + o.m_r) * (m_r + o.m_r) > dis)return true;elsereturn false;}
}
//计算两球圆心之间的距离
double Sphere::distance(Sphere& o)
{return (m_x - o.m_x) * (m_x - o.m_x) + (m_y - o.m_y) * (m_y - o.m_y) + (m_z - o.m_z) * (m_z - o.m_z);
}
//计算两球相交部分体积
double Sphere::vol_ints(Sphere& o)
{if (!intersect(o))return 0;else{double dis = distance(o);double max = m_r > o.m_r ? m_r : o.m_r;double min = m_r > o.m_r ? o.m_r : m_r;if (sqrt(dis) + min <= max)return 4 / 3 * Pi * pow(min, 3);else{double cos_a = (max * max + dis * dis - min * min) / (2 * max * dis);double cos_b = (min * min + dis * dis - max * max) / (2 * min * dis);double h_a = max * (1 - cos_a);double h_b = min * (1 - cos_b);return (Pi / 3) * (3 * max - h_a) * h_a * h_a + (Pi / 3) * (3 * min - h_b) * h_b * h_b;}}
}

第一次写文章,发现错误的话请各位多多指教

求两个球体相交部分体积,公式及推导,C++实现相关推荐

  1. 平面上有两个圆相交,求两个圆相交部分的面积

    平面上有两个圆相交,求两个圆相交部分的面积 又学习了一遍算法,感触颇深,也对算法有了更进一步的认识,记录一下这次的学习,希望能帮到有需要的人. 输入:六个参数:第一个圆的圆心坐标,半径,第二个圆的圆心 ...

  2. hdu 5120(求两个圆环相交的面积 2014北京现场赛 I题)

    两个圆环的内外径相同 给出内外径 和 两个圆心 求两个圆环相交的面积 画下图可以知道 就是两个大圆交-2*小圆与大圆交+2小圆交 Sample Input 2 2 3 0 0 0 0 2 3 0 0 ...

  3. 两个圆柱相交的体积 UVALive 5096 Volume

    本博客主要讨论从积分和非积分方式计算两个圆柱体交集的体积.由于博主的高数很烂,有什么不得当的地方还望大家指出来. 两个圆柱相交: 不难发现相交有两种情况,如图所示是2R<H2R的情况. 我们先暂 ...

  4. java 圆的交点_java求两个圆相交坐标

    最近由于项目需要,根据两个圆函数求出相交的坐标.实现代码如下,另感谢两圆求交点算法实现Java代码,虽然他所贡献的代码中存在问题,但仍有借鉴意义. 1.两个圆相交的数学求法 在中学数学中我们知道,一个 ...

  5. python 求两线段是否相交,如果相交求交点

    代码如下,cal_point = False 不输出交点,cal_point = True 输出交点 def cross(p1,p2,p3):#跨立实验     x1=p2.x-p1.x     y1 ...

  6. java求两个圆相交坐标

    最近由于项目需要,根据两个圆函数求出相交的坐标.实现代码如下,另感谢两圆求交点算法实现Java代码,虽然他所贡献的代码中存在问题,但仍有借鉴意义. 1.两个圆相交的数学求法 在中学数学中我们知道,一个 ...

  7. 算法分析课设(一)平面上有两个圆相交,求两个圆相交部分的面积

    写出算法的文字描述 第一步:输入两个圆的参数 x1. y1. r1. x2. y2. r2. 第二步:计算两圆的距离d,然后分以下四种情况判断: 1.相离或相切.若d>=(r1+r2),则 s= ...

  8. 计算长方体体积编程_如何求N个球体在空间中所占的体积?

    最近,我遇到了一个这样的应用问题.在三维空间存在N个球体,球体间可能会存在相离.相切.相交和包含的关系, 现给出球体的球心坐标和对应的半径,如何求解这N个球体在三维空间所占的体积? 对于最一般的情况, ...

  9. 趣题:求两圆柱相交部分的体积

    昨天去图书馆看趣味数学大师马丁加德纳的小册子<意料之外的绞刑>,看到了这个趣题:求两圆柱相交部分的体积(两圆柱半径都为1)(正交).要求是不用微积分,只用高中生就能看懂的简单数学.如果你难 ...

最新文章

  1. 多文多面阐述HMM很清晰
  2. 一点一滴培养你的领导气质
  3. modelsim-win64-10.1c的安装和基本使用
  4. java ArrayList 套数组,二维不等长数组
  5. IMX6ULL的GPIO操作方法
  6. 成功解决ValueError: (‘Unknown transform primitive years. ‘, ‘Call ft.primitives.list_primitives() to get
  7. .NET5全面拥抱Azure云,微软市值重回巅峰,那些年吹过的牛,都实现了!
  8. [有限元] Ansys Workbench 实现 Edge 的分段 Pressure 的方法:SpaceClaim 中使用分割面
  9. R语言实现混频数据分析
  10. CSDN极客头条使用指南
  11. 绝地求生信号服务器崩溃,绝地求生奔溃怎么办 吃鸡游戏崩溃解决方法
  12. SQLServer 2000 Service Pack 4 简体中文版
  13. 计网 - TCP 的稳定性:滑动窗口和流速控制是怎么回事?
  14. 安装office未能启动服务器,Office 2010安装时遇到1920错误问题怎么解决?
  15. ROS创建Web代理(Web proxy)给QQ使用HTTP代理
  16. 北京轨道交通明起推出电子定期票 不享累计优惠政策
  17. 第二类曲线、曲面积分计算公式
  18. 不管她是否调皮、不管她成绩是否优秀、也不管她是否迷恋游戏,只想她能睁开眼睛。
  19. 如何选购一款优质的台式电脑电源?
  20. egg.js入门教程视频文件(转载于cnode社区)

热门文章

  1. ThinkSNS电商版,电子商务社交的福音
  2. 《图解密码技术》(第三版)结城浩-知识结构整理
  3. WebStorm-2021安装教程
  4. 广发信用卡超方便的激活方法
  5. Vue 之 Vuex(3)mapState 的使用
  6. mapState使用方法
  7. Configuration file contains invalid cp936 characters in C:\Users\xxx\pip\pip.ini.
  8. “百合杯“表彰典礼即将于电影频道播出
  9. 学而思高并发活动保障方案
  10. JObject转换修改key值