首页 > 代码库 > POJ 2208 Pyramids 欧拉四面体

POJ 2208 Pyramids 欧拉四面体

给出边长,直接就可以求出体积咯

 

关于欧拉四面体公式的推导及证明过程

2010-08-16 14:18

 

1,建议x,y,z直角坐标系。设A、B、C少拿点的坐标分别为(a1,b1,c1),(a2,b2,c2),(a3,b3,c3),四面体O-ABC的六条棱长分别为l,m,n,p,q,r;

2,四面体的体积为,由于现在不知道向量怎么打出来,我就插张图片了,




将这个式子平方后得到:

3,根据矢量数量积的坐标表达式及数量积的定义得



又根据余弦定理得

4,将上述的式子带入(1),就得到了传说中的欧拉四面体公式

摘自:http://www.cnblogs.com/kuangbin/archive/2012/04/13/2446378.html

 

代码:

//#pragma comment(linker, "/STACK:16777216") //for c++ Compiler#include <stdio.h>#include <iostream>#include <cstring>#include <cmath>#include <stack>#include <queue>#include <vector>#include <algorithm>#define ll long long#define Max(a,b) (((a) > (b)) ? (a) : (b))#define Min(a,b) (((a) < (b)) ? (a) : (b))#define Abs(x) (((x) > 0) ? (x) : (-(x)))using namespace std;double P( double a,double b,double c,double d,double e ){    return a*(b*c-d*e);}double EulerTetrahedron(double OA, double OB, double OC, double AB, double BC, double CA){    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.);    return sqrt(ans/36);}int main(){    double OA,OB,OC,AB,BC,CA;    while( scanf("%lf%lf%lf%lf%lf%lf",&OA,&OB,&OC,&AB,&CA,&BC)!=EOF ){        printf("%.4f\n",euler(OA, OB, OC, AB, BC, CA));    }    return 0;}