随笔 - 73  文章 - 0 评论 - 0 阅读 - 6680
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

计算两个球体的体积交

double Pi = 3.1415926535;
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)
	{
	}
	bool intersect(Sphere& o);
	double vol_ints(Sphere& o);
	double distance(Sphere& o);
};
//判断两个球是否相交
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;
		else
			return 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 = sqrt(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 (dis + min <= max)
			return 4.0 * Pi * pow(min, 3) / 3.0;
		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;
		}
	}
}
posted on   naiji  阅读(172)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示