加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

[计算几何]POJ 2208欧拉四面体体积公式

(2011-08-13 18:56:53)
标签:

杂谈

分类: ACMsteps

20110813

今天做的新题哟~~偶然发现的.

题目大意:6条边,0A,OB,OC,AB,AC,BC;求这六条边确定的四面体的面积。

解题思路:网上有欧拉公式求四面体体积的详细解题报告。很认真的看了,发现确实很好。下面我自己推导一边吧,美丽的数学啊~巨弱项。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;

这里WA2次,本来以为是精度问题= =

#include<iostream>

#include<cmath>

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( "%.4lf\n",sqrt(ans/36) );      

    }

    return 0;

}

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有