题目链接:哆啦A梦传送门
参考博客:
https://www.cnblogs.com/dgsrz/articles/2590309.html
1,建议x,y,z直角坐标系。设A、B、C少拿点的坐标分别为(a1,b,1,c1),(a2,b2,c2),(a3,b3,c3),四面体O-ABC的六条棱长分别为l,m,n,p,q,r;
2,四面体的体积为
表示
的面积,再根据叉积公式
,所以就很容易得到上面的向量公式了,
两向量叉积可以用行列式表示,详情参考维基:我爱维基
将这个式子平方后得到:
3,根据矢量数量积的坐标表达式及数量积的定义得
又根据余弦定理得,这里用的是点积,不同于上面的叉积,为什么我们会知道这里用的是点积呢?很简单,我们从表达式就很容易知道了。
4,将上述的式子带入(1),就得到了传说中的欧拉四面体公式
最后结果就出来了,简单的解个行列式。
代码:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
///AB,AC,AD,BC,BD,CD。
int main()
{
double p,q,r,m,n,l;
///注意对应存储边
while(~scanf("%lf%lf%lf%lf%lf%lf",&n,&m,&p,&l,&q,&r))
{
double tmp1=(p*p+q*q-n*n)/2.0;
double tmp2=(p*p+r*r-m*m)/2.0;
double tmp3=(q*q+r*r-l*l)/2.0;
double volume=p*p*q*q*r*r+tmp1*tmp3*tmp2*2;
volume=volume-(tmp2*tmp2*q*q+tmp3*tmp3*p*p+r*r*tmp1*tmp1);
printf("%.4f\n",sqrt(volume)/6.0);
}
return 0;
}
我的标签:做个有情怀的程序员。