『HDU 5733』tetrahedron

转载声明:http://blog.csdn.net/david_jett/article/details/51967773
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5733

个人感想:马丹…就是套一堆公式,这些都是我不知道得东西…直接看转载吧,清楚得不行。。

分析:几何公式
代码:

/* Author:GavinjouElephant
 * Title:
 * Number:
 * main meanning:
 *
 *
 *
 */

//#define OUT
#include <iostream>
using namespace std;
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <sstream>
#include <cctype>
#include <vector>
#include <set>
#include <cstdlib>
#include <map>
#include <queue>
//#include<initializer_list>
//#include <windows.h>
//#include <fstream>
//#include <conio.h>
#define MaxN 0x7fffffff
#define MinN -0x7fffffff
#define Clear(x) memset(x,0,sizeof(x))
const int INF=0x3f3f3f3f;
typedef long long ll;
ll x[4],y[4],z[4];
ll a[2],b[2],c[2];
ll nx[2],ny[2],nz[2];//法向量
double s[4];
double v[6];
double volume;
double get_dis(int i,int j)
{
    return sqrt(1.0*(x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])+(z[i]-z[j])*(z[i]-z[j]));
}
double get_are(int i,int j,int k)
{
    double le[3],ave,res;
    le[0]=get_dis(i,j);
    le[1]=get_dis(j,k);
    le[2]=get_dis(i,k);
    ave=(le[0]+le[1]+le[2])/2;
    res=sqrt(ave*(ave-le[0])*(ave-le[1])*(ave-le[2]));
    return res;
}
int main()
{
#ifdef OUT
    freopen("coco.txt","r",stdin);
    freopen("lala.txt","w",stdout);
#endif
    while(scanf("%lld",&x[0])!=EOF)
    {
        scanf("%lld%lld",&y[0],&z[0]);
        for(int i=1;i<=3;i++)
        {
            scanf("%lld%lld%lld",&x[i],&y[i],&z[i]);
        }
        a[0]=x[1]-x[0];
        b[0]=y[1]-y[0];
        c[0]=z[1]-z[0];

        a[1]=x[2]-x[0];
        b[1]=y[2]-y[0];
        c[1]=z[2]-z[0];

        nx[0]=b[0]*c[1]-c[0]*b[1];
        ny[0]=-(a[0]*c[1]-a[1]*c[0]);
        nz[0]=a[0]*b[1]-b[0]*a[1];

        nx[1]=x[3]-x[0];
        ny[1]=y[3]-y[0];
        nz[1]=z[3]-z[0];

         if(nx[0]*nx[1]+ny[0]*ny[1]+nz[0]*nz[1]==0)
            printf("O O O O\n");
        else
        {
              s[0]=get_are(1,2,3);
              s[1]=get_are(0,2,3);
              s[2]=get_are(0,1,3);
              s[3]=get_are(0,1,2);

              v[0]=get_dis(0,1);
              v[1]=get_dis(0,2);
              v[2]=get_dis(0,3);
              v[3]=get_dis(2,3);
              v[4]=get_dis(1,3);
              v[5]=get_dis(1,2);

              for(int i=0;i<6;i++) v[i]*=v[i];

              double M1=(v[1]+v[2]+v[4]+v[5]-v[0]-v[3]);
              double M2=(v[0]+v[2]+v[3]+v[5]-v[1]-v[4]);
              double M3=(v[0]+v[1]+v[3]+v[4]-v[2]-v[5]);
              double Q=v[0]*v[1]*v[5]+v[1]*v[2]*v[3]+v[2]*v[0]*v[4]+v[3]*v[4]*v[5];

              volume=sqrt(v[0]*v[3]*M1+v[1]*v[4]*M2+v[2]*v[5]*M3-Q)/12;
              double radius=volume*3/(s[0]+s[1]+s[2]+s[3]);
              double  ax=0;
              double  ay=0;
              double  az=0;
              double  ts=(s[0]+s[1]+s[2]+s[3]);

               for(int i=0;i<4;i++)
              {
               ax+=s[i]*x[i];
               ay+=s[i]*y[i];
               az+=s[i]*z[i];
              }
              ax/=ts;
              ay/=ts;
              az/=ts;
              printf("%.4f %.4f %.4f %.4f\n",ax,ay,az,radius);
        }


    }

    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值