swustoj搭帐篷说..(0330)

来源:互联网 发布:excel找重复数据 编辑:程序博客网 时间:2024/04/27 13:48

青海玉树“4.14”地震发生后,灾民展开自救.因为物资紧缺,有些帐篷便被搭建成底座是三角形的四面体。而要最大限度的让灾民有遮风避雨之地,只能暂时按人数来平均支配空间.现只知道帐篷的棱长,想请你帮忙计算出这种帐篷的体积. 例如:

Description

多组输入,每组包含6个不大于1000的正整数,分别代表帐篷ABCD的六条棱AB,AC,AD,BC,BD,CD的长度.

Input

该帐篷的体积,精确到小数点后3位.

Output
1
2
1 1 1 1 1 1
1000 1000 1000 3 4 5
Sample Input
1
2
0.118
1999.994

解题思路:网上有欧拉公式求四面体体积的详细解题报告。很认真的看了,发现确实很好。下面我自己推导一边吧,美丽的数学啊~巨弱项。X:代表叉乘,*代表点乘;

给定四个点O(0,0,0),A(Xa,Ya,Ca),B(Xb,Yb,Yc),C(Za,Zb,Zc);

                   Xa,Ya,Za

V=1/6*(OA x OB)*OC =|Xb,Yb,Yb |

                   Xc,Yc,Zc

WHY?:

OA x OB = 2*OAB;

V = 1/3*OAB*OC*sin(C);

代入即V=1/6*(OA x OB)*OC

         Xa,Ya,Za    Xa,Xb,Xc

V2 =1/36*|Xb,Yb,Yb |*|Ya,Yb,Yc |;

         Xc,Yc,Zc    Za, Zb, Zc

然后行列式相乘,不阐述了;

会得出两个基本项 Xa*Xa+Ya*Ya+Za*Za=|OA|2;

                 Xa*Xb+Ya*Yb+Za*Zb=OA*OB=OA*OB*cos(AOB)=OA2+OB2-OC2/2;

这样将坐标的关系变换为边的关系;

直接套公式就可以求解了;

这里要注意的就是对应的边不可以乱换,用来旋转是可以的,兑换的话就会有问题;

OA,OB,OC三遍可以旋转,不可兑换同理对于AB,AC,BC;


#include<iostream>#include<cmath>#include<stdio.h>#include<math.h>using namespace std;double P(double a, double b, double c, double d, double e) { return a*(b*c - d*e); }int main(){double OA, OB, OC, AB, BC, CA;while (scanf("%lf %lf %lf %lf %lf %lf", &OA, &OB, &OC, &AB, &CA, &BC) != EOF){OA *= OA; OB *= OB; OC *= OC; AB *= AB; CA *= CA; BC *= BC;double ans = 0;ans += P(OA, OB, OC, (OB + OC - BC) / 2., (OB + OC - BC) / 2.);ans -= P((OA + OB - AB) / 2., (OA + OB - AB) / 2., OC, (OA + OC - CA) / 2., (OB + OC - BC) / 2.);ans += P((OA + OC - CA) / 2., (OA + OB - AB) / 2., (OB + OC - BC) / 2., OB, (OA + OC - CA) / 2.);printf("%.3lf\n", sqrt(ans / 36));}return 0;}


0 0