根据空间4点坐标求球心坐标
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
程序设计艺术与方法课程
2012“达内杯”安徽省程序设计竞赛
Problem J 银河系5A风景区
解题报告
题目原文:
Description
巴尔坦星是个银河系中一个著名的观光景点,它之所有著名,是因为巴尔坦星有四颗卫星,而且四颗卫星距离巴尔坦星的距离都是一样的!某天,巴尔坦星上的居民们想知道自己星球所处的具体三维宇宙坐标,因为科技落后,巴尔坦星上的居民只有某个时刻测得的四颗卫星的坐标。现在请你写个程序帮可怜的巴尔坦星居民给自己的星球定下位吧。
Input
第一行是一个整数t,表示有t组测试数据。(t <= 30)
每组数据占四行,表示四颗卫星的坐标。
每行三个实数x, y, z表示该点的坐标为(x,y,z)。
输入数据保证每组的数据都可以确定巴尔坦星,设巴尔坦星的坐标为(ox, oy, oz),每颗卫星到巴尔坦星的距离都是r。
则以下不等式总是成立:
-500 <= ox, oy, oz <= 500,500 <= r <= 1000。
Output
对于每组数据输出一行;"Case #k: x y z" 。k表示第k组数据,x, y, z 表示巴尔坦星的坐标(均保留到小数点后一位)。
Sample Input
1
1.1 0 0
0.1 1.0 0
0.1 -1.0 0
0.1 0 1.0
Sample Output
Case #1: 0.1 0.0 0.0
解题思路:
本题本质上是一道空间解析几何题,其核心是利用三维空间中不共面的四个点的坐标来求球心坐标。我利用四个点到球心距离相等的性质,列出四个三元二次方程,再两两消去,得到三个三元一次方程,该方程组是一个线性非齐次方程组,
利用系数行列式表示,并且运用克拉默法则,可以解出该方程组,方程组的解就是球心的坐标。
算法:
题中所要求坐标的星球有四颗卫星,可以对应空间中的四个点,因为知道四个卫星的坐标,所以已知这四个点的坐标,可设为A(x1,y1,z1)、B(x2,y2,z2)、C(x3,y3,z3)、D(x4,y4,z4),设半径为r ,球心O 坐标为(x,y,z)。利用四点到球心距离相等的性质得到如下四个方程。
(x −x1)2+(y −y1)2 +(z −z1)2 =r 2; (x −x2)2+(y −y2)2 +(z −z2)2 =r 2; (x −x3)2+(y −y3)2 +(z −z3)2 =r 2; (x −x3)2+(y −y3)2 +(z −z3)2 =r 2;
展开得:
x 2+y 2+z 2−2(x1x+y1y+z1z) + x12 + y12 + z12=r 2; ○1 x 2+y 2+z 2−2(x2x+y2y+z2z) + x22 + y22 + z22=r 2; ○2 x 2+y 2+z 2−2(x3x+y3y+z3z) + x32 + y32 + z32=r 2; ○3 x 2+y 2+z 2−2(x4x+y4y+z4z) + x42 + y42 + z42=r 2; ○
4
分别作○1−○2、○3−○4、○2−○3得:
(x1-x2)x+(y1-y2)y+(z1-z2)z=1
2(x12−x22 + y12−x22 + z12−z22);
(x3-x4)x+(y3-y4)y+(z3-z4)z=12(x32
−x42 + y32−x42 + z32−z42);
(x2-x3)x+(y2-y3)y+(z2-z3)z=12
(x22
−x32 + y22−x32 + z22−z32);
其对应的系数行列式可设为:
D=
a b c
a1b1c1
a2b2c2则a=(x1-x2), b=(y1-y2), c=(z1-z2)
a1=(x3-x4), b1=(y3-y4), c1=(z3-z4);
a2=(x2-x3), b2=(y2-y3), c2=(z2-z3);
常数项行列式为:
P
Q
R
则P=1
2(x1
2−x22+ y12−x22+ z12−z22);
Q=1
2(x3
2−x42+ y32−x42+ z32−z42);
R=1
2(x2
2−x32+ y22−x32+ z22−z32);
现设Dx=
P b c
Q b1c1
R b2c2
Dy=
a P c
a1Q c1
a2R c2 DZ=
a b P a1b1Q a2b2R
由线性代数中的克拉默法则可知:
x=Dx / D;
y=Dy / D;
z=Dz / D;
由此即可解出三元一次方程组的解,所得解也就是空间四个点所在球的球心坐标。还原至题中亦即巴尔坦星的坐标。
收获和分析:
我的收获:
在解决问题的过程中,我了解到了方法和知识的重要性,在解决问题的过程中采取合适的方法将事半功倍,而这需要我们平时不断地积累,善于使用专业课所学的知识;还有就是团队协作的能力得到了锻炼,本题的解答,是我和室友共同努力的结晶,是我们团队协作的成果。
关于题目的分析:
解题过程中,我曾一度陷入僵局,早先就列出了三元一次方程组,却是利用高中时所学的代入法,解出了x, y ,z的公式,但解出的公式却有一个致命伤,对输入的很多组测试数据,偶尔有使公式的分母出现0的情况,此时公式便失去了作用,即程序有bug,这个问题是公式法算法中迟迟无法解决的。而就本题而言,采用行列式的解法和克拉默法则后,只有当空间中的四点共面时才会出现无解的情况,而这时才会使系数行列式D值为0;通过数学我们知道,共面的四个点无法确定一个球,所以本题合理的输入不应包括共面的四个点的坐标。有了求解球心的函数之后(以上算法编成一个函数),开始考虑规范化输入输出,这应当不难解决
源代码:。
#include
#include
#include
#define maxnum 30
using namespace std;
void solve();
//double distances(double x1,double y1,double z1,double h1,double h2,double h3);
int main()
{
solve();
system("PAUSE");
return 0;
}