计算几何:记录求两球体相交部分体积(球缺)模板
模板:(PS:该模板自己网上找的,链接:https://blog.csdn.net/sugarbliss/article/details/86592894)
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#define CLR(a,b) memset(a,b,sizeof(a));
const int inf=0x3f3f3f3f;
using namespace std;
const double PI = acos(-1.0);
typedef unsigned long long ll;
const int maxn= 110;
typedef struct point {double x,y,z;point() {}point(double a, double b,double c) {x = a;y = b;z = c;}point operator -(const point &b)const { //返回减去后的新点return point(x - b.x, y - b.y,z-b.z);}point operator +(const point &b)const { //返回加上后的新点return point(x + b.x, y + b.y,z+b.z);}//数乘计算point operator *(const double &k)const { //返回相乘后的新点return point(x * k, y * k,z*k);}point operator /(const double &k)const { //返回相除后的新点return point(x / k, y / k,z/k);}double operator *(const point &b)const { //点乘return x*b.x + y*b.y+z*b.z;}
}point;double dist(point p1, point p2) { //返回平面上两点距离return sqrt((p1 - p2)*(p1 - p2));
}
typedef struct sphere {//球double r;point centre;
}sphere;
sphere s,a[maxn];
void SphereInterVS(sphere a, sphere b,double &v,double &s) {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)) * 2;//h1=h2,球冠的高double angle_a = 2 * acos((a.r*a.r + d*d - b.r*b.r) / (2.0 * a.r*d)); //余弦公式计算r1对应圆心角,弧度double angle_b = 2 * acos((b.r*b.r + d*d - a.r*a.r) / (2.0 * b.r*d)); //余弦公式计算r2对应圆心角,弧度double l1 = ((a.r*a.r - b.r*b.r) / d + d) / 2;double l2 = d - l1;double x1 = a.r - l1, x2 = b.r - l2;//分别为两个球缺的高度double v1 = PI*x1*x1*(a.r - x1 / 3);//相交部分r1圆所对应的球缺部分体积double v2 = PI*x2*x2*(b.r - x2 / 3);//相交部分r2圆所对应的球缺部分体积v = v1 + v2;//相交部分体积double s1 = PI*a.r*x1; //r1对应球冠表面积double s2 = PI*a.r*x2; //r2对应球冠表面积s = 4 * PI*(a.r*a.r + b.r*b.r) - s1 - s2;//剩余部分表面积
}
int t, n;
double x, y, z, r;
int cas = 1;
int main()
{cin >> t;while(t--){cin >> n;for(int i = 1; i <= n; i++){scanf("%lf%lf%lf%lf",&x,&y,&z,&a[i].r);a[i].centre = {x,y,z};}scanf("%lf%lf%lf%lf",&x,&y,&z,&r);s.r = r;s.centre = {x,y,z};double ans = 0, v = 0;for(int i = 1; i <= n; i++){double ss, dis = dist(s.centre, a[i].centre);if(dis >= s.r + a[i].r)continue; //在外部if(dis + min(s.r, a[i].r) <= max(s.r, a[i].r)) //在内部{ans += 4.0 / 3.0 * PI * min(s.r,a[i].r) * min(s.r,a[i].r) * min(s.r,a[i].r);continue;}SphereInterVS(s, a[i], v, ss); //相交部分ans += v;}printf("Case #%d: %.14f\n",cas++,ans);}
}
三种情况,两圆圆心都不在相交区域,两圆圆心都在相交区域,只有一圆圆心在相交区域,公式全部适用。
c1到c2的距离为d,c1到o点的距离为l1,c2到o点的距离为l2,x1为圆c1的球缺的高,x2为圆c2的球缺的高。
计算几何:记录求两球体相交部分体积(球缺)模板相关推荐
- 趣题:求两圆柱相交部分的体积
昨天去图书馆看趣味数学大师马丁加德纳的小册子<意料之外的绞刑>,看到了这个趣题:求两圆柱相交部分的体积(两圆柱半径都为1)(正交).要求是不用微积分,只用高中生就能看懂的简单数学.如果你难 ...
- 求两个球体相交部分体积,公式及推导,C++实现
目录 公式 推导 代码 公式 两球相交分为两种情况: 第一种 大球完全包围了小球 第二种 两球相交但无完全包含关系 第一种情况的答案是显而易见的,直接求出小球体积即可 下面给出第二种情况的求解方法 V ...
- matlab 求曲面体积,matlab求两曲面之间的体积
MATLAB求曲面相交所成空间曲线的图形 放在你程序后也可,单独运行也行:t=-0.1:0.1:2*pi;x=2*cos(t);%交线参数方程z=2*sin(t);y1=sqrt(5)*ones(si ...
- 求两圆相交的交点的方法
最近研究三角定位算法,研究了下怎样求两圆的交点,现给出求解方法:
- 求两圆相交面积(模板)
两圆相交分如下集中情况:相离.相切.相交.包含. 设两圆圆心分别是O1和O2,半径分别是r1和r2,设d为两圆心距离.又因为两圆有大有小,我们设较小的圆是O1. 相离相切的面积为零,代码如下: dou ...
- 求两个相交的线性函数的交点的Python程序
分别已知两个函数上的两个不同的点,求两个线性函数的交点 from sympy import * x = symbols('x') #求两个函数的交点 x1 = 1 x2 = -2 #第一个函数过的两点 ...
- 求两个相交链表的交点
只能遍历一次链表,空间复杂度为o(1) 先处理一个链表,遍历的时候要把其指向的Next的值为null 再变量第二个链表,就可以求出交点
- 求两个相交圆的交点的公式
半径为R的圆心为A,坐标为(x,y) 半径为S的圆心为B,坐标为(a,b) 两圆交点为C,D AB与CD的交点为E,坐标为(X0,Y0) 过C点垂线与过E点水平线交点为F 令L为AB长度 ...
- java求两个圆相交坐标
最近由于项目需要,根据两个圆函数求出相交的坐标.实现代码如下,另感谢两圆求交点算法实现Java代码,虽然他所贡献的代码中存在问题,但仍有借鉴意义. 1.两个圆相交的数学求法 在中学数学中我们知道,一个 ...
- 如何求两个向交矩形的交集的面积?
http://blog.csdn.net/yanleigis/article/details/3158223 如何求两个相交矩形的交集的面积? 就是交接的公共部分面积? class Rectangl ...
最新文章
- 剑指offer---二叉树和双向链表
- Spark源码的编译过程详细解读(各版本)(博主推荐)
- 充电类型一二次检测过程及充电类型
- MYECLIPSE中快速解决项目的错误的方法
- spring客户端resttemplate/feign/httpclient调研
- python实现背景抠除_利用Python代码实现一键抠背景功能
- manjaro 搜狗输入法_Manjaro日常使用 之一:日常办公
- SSL 延迟与 Http、Https
- [海隆软件][方正电机]IPO,打新股中
- windows黑客编程系列(二):DLL延迟加载和资源释放
- MySQL执行多表联查时,报错ln aggregated query without GROUP BY
- 【Redis】2. 入门篇
- vmware设置桥接时复制物理网络连接状态是什么意思?
- 小白学渗透——渗透测试基本流程
- 【计算机网络】谢希仁笔记 运输层
- 阿里云短信服务与微信小程序对接进行注册
- 计算机网络课论文参考文献,计算机网络课程论文
- 机器翻译中的古汉语现代汉语句子对齐研究
- Conflux迎来重大升级,引入EVM兼容空间及PoS链
- java调用FFmpeg实现视屏压缩
热门文章
- c语言指针 汇编间接寻址,C语言指针和汇编语言间接寻址的关省略探讨从存储空间图的视角加以分析.pdf...
- android 如何把图片设置成圆,Android 设置圆形图片 设置圆角图片
- STM32单片机跑马灯实验解析
- 计算机系统关机后自动重启,深度技术win7系统电脑关机后又自动开机如何解决【图文】...
- 数字钟Matlab仿真,简单数字钟仿真电路图大全(五款数字钟仿真电路图) - 全文...
- 申请gmail邮箱及foxmail邮箱
- Choerodon猪齿鱼团队敏捷项目管理实践应用
- Windows自动更新呈灰色点不了,电脑会自动更新的解决方案
- 保险经纪公司达信联合IBM开发区块链平台
- Beats:如何在 Elastic Stack 中得到并使用 Root CA Certificate fingerprint