转载声明: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;
}