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;
}

 

posted @ 2014-08-20 20:20  Jeremy Wu  阅读(248)  评论(0编辑  收藏  举报