题目大意
题解
数学题
真的是数学题!
以下为思路
在一维中,交集是区间和
黑线为数轴,黄色区域是红色区域和蓝色区域的集合
因为一维过于简单,题目的思路就不放了
在二维中
题目意思可理解为有两点A、B,动点P在二维坐标系中运动,使得
P
A
P
B
=
K
\frac{PA}{PB}=K
PBPA=K
因为二维证明用
小学二年级数学知识易证,不再累述
那么
在三维中
.
.
.
.
.
.
.
.
.
.
.
.
.
.
三维画不出来哈哈哈
那么,
代数证明!
给出4个点
A
(
x
0
,
y
0
,
z
0
)
,
B
(
x
1
,
y
1
,
z
1
)
,
C
(
x
2
,
y
2
,
z
2
)
,
D
(
x
3
,
y
3
,
z
3
)
A(x_0,y_0,z_0),B(x_1,y_1,z_1),C(x_2,y_2,z_2),D(x_3,y_3,z_3)
A(x0,y0,z0),B(x1,y1,z1),C(x2,y2,z2),D(x3,y3,z3)
以A,B,P1为例,设P1(x,y,z),依据题目限制条件先写出关系式:
(
x
−
x
0
)
2
+
(
y
−
y
0
)
2
+
(
z
−
z
0
)
2
=
k
1
∗
k
1
∗
[
(
x
−
x
1
)
2
+
(
y
−
y
1
)
2
+
(
z
−
z
1
)
2
]
(x−x_0)^2+(y−y_0)^2+(z−z_0)^2=k1∗k1∗[(x−x_1)^2+(y−y_1)^2+(z−z_1)^2]
(x−x0)2+(y−y0)2+(z−z0)2=k1∗k1∗[(x−x1)2+(y−y1)2+(z−z1)2]
化简得
(
k
1
2
−
1
)
(
x
2
+
y
2
+
z
2
)
−
(
2
k
1
2
x
1
−
2
x
0
)
x
−
(
2
k
1
2
y
1
−
2
y
0
)
y
−
(
2
k
1
2
z
1
−
2
z
0
)
z
+
k
1
2
(
x
1
2
+
y
1
2
+
z
1
2
)
−
x
0
2
−
y
0
2
−
z
0
2
=
0
(k_1^2−1)(x^2+y^2+z^2)−(2k_1^2x _1−2x_ 0)x−(2k_1^2y_1−2y_0)y−(2k_1^2z_1−2z_0)z+k_1^2(x_1^2+y_1^2+z_1^2)−x_0^2−y_0^2−z_0^2=0
(k12−1)(x2+y2+z2)−(2k12x1−2x0)x−(2k12y1−2y0)y−(2k12z1−2z0)z+k12(x12+y12+z12)−x02−y02−z02=0
可知为球的轨迹方程
一般方程计算球心半径
x
2
+
y
2
+
z
2
+
2
a
x
+
2
b
y
+
2
c
z
+
d
=
0
x^2+y^2+z^2+2ax+2by+2cz+d=0
x2+y2+z2+2ax+2by+2cz+d=0
化作标准方程
(
x
+
a
)
2
+
(
y
+
b
)
2
+
(
z
+
c
)
2
=
a
2
+
b
2
+
c
2
−
d
(x+a)^2+(y+b)^2+(z+c)^2=a^2+b^2+c^2-d
(x+a)2+(y+b)2+(z+c)2=a2+b2+c2−d
可得球心坐标
O
(
−
a
,
−
b
,
−
c
)
O(-a,-b,-c)
O(−a,−b,−c)
可得半径
r
=
a
2
+
b
2
+
c
2
−
d
r=\sqrt{a ^2 +b ^2+c^ 2−d}
r=a2+b2+c2−d
得出R1,同理解出R2以及两球球心,题目就可以解出了!
( 用到球冠体积公式)
.
.
.
.
.
.
.
不会求?
.
.
.
.
.
.
.
.
没关系! 我也不会233
球冠体积怎么求?
完成! 以下AC代码
代码
#include<bits/stdc++.h>
using namespace std;
const double pai=acos(-1);
int t;
double x[5],y[5],z[5];
double k1,k2;
void solve(double x1,double y1,double z1,double r1,double x2,double y2,double z2,double r2)
{
double ans=0;
double dis;//球心距离
dis=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)+(z1-z2)*(z1-z2));
if(dis>=r1+r2)
{
ans=0;
//相离或相切
}
else if(dis+r1<=r2)
{
ans=(4.00/3.00)*pai*r1*r1*r1;
//内含或内切
}
else if(dis+r2<=r1)
{
ans=(4.00/3.00)*pai*r2*r2*r2;
//内含或内切
}
else
{
double cal=(r1*r1+dis*dis-r2*r2)/(2.00*dis*r1);
double h=r1*(1-cal);
ans+=(1.00/3.00)*pai*(3.00*r1-h)*h*h;
cal=(r2*r2+dis*dis-r1*r1)/(2.00*dis*r2);
h=r2*(1.00-cal);
ans+=(1.00/3.00)*pai*(3.00*r2-h)*h*h;
}//相交
printf("%.3f\n",ans);
}
int main()
{
int i,j;
cin>>t;
while(t--)
{
for(i=0;i<4;i++)
cin>>x[i]>>y[i]>>z[i];
cin>>k1>>k2;
double sum1=k1*k1-1;
double c1x,c1y,c1z,c1r,t;
c1x=(k1*k1*x[1]-x[0])/sum1;
c1y=(k1*k1*y[1]-y[0])/sum1;
c1z=(k1*k1*z[1]-z[0])/sum1;
t=k1*k1*((x[1]*x[1])+(y[1]*y[1])+(z[1]*z[1]))-x[0]*x[0]-y[0]*y[0]-z[0]*z[0];
t/=sum1;
c1r=sqrt(c1x*c1x+c1y*c1y+c1z*c1z-t);
//计算球2的球心坐标和半径
double sum2=k2*k2-1;
double c2x,c2y,c2z,c2r;
c2x=(k2*k2*x[3]-x[2])/sum2;
c2y=(k2*k2*y[3]-y[2])/sum2;
c2z=(k2*k2*z[3]-z[2])/sum2;
t=k2*k2*((x[3]*x[3])+(y[3]*y[3])+(z[3]*z[3]))-x[2]*x[2]-y[2]*y[2]-z[2]*z[2];
t/=sum2;
c2r=sqrt(c2x*c2x+c2y*c2y+c2z*c2z-t);
//计算两个球相交部分体积
solve(c1x,c1y,c1z,c1r,c2x,c2y,c2z,c2r);
}
return 0;
}