思路:百度一大堆公式...然后搞就好了...注意公式不要打错...叉积不要打错...



#include<bits/stdc++.h>
using namespace std;
struct point
{
	double x,y,z;
}p[5];
struct pingmian
{
	double a,b,c,d;
}pm[5];
double area[5];
int check(point p0,point p1,point p2)
{
	p1.x-=p0.x,p1.y-=p0.y,p1.z-=p0.z;
	p2.x-=p0.x,p2.y-=p0.y,p2.z-=p0.z;
	if((p1.x*p2.y==p1.y*p2.x) && (p1.x*p2.z==p1.z*p2.x) && (p1.y*p2.z==p1.z*p2.y))
		return 0;
	return 1;
}

double pointoplaneDist(double x,double y,double z,double a,double b,double c,double d)
{
    return fabs(a*x+b*y+c*z+d)/sqrt(a*a+b*b+c*c);
}
double dist(point p0,point p1)
{
	return sqrt((p0.x-p1.x)*(p0.x-p1.x)+(p0.y-p1.y)*(p0.y-p1.y)+(p0.z-p1.z)*(p0.z-p1.z));
}
point cross(point p0,point p1)
{
	point p2;
	p2.x = p0.y*p1.z-p0.z*p1.y;
	p2.y = -p0.x*p1.z+p0.z*p1.x;
	p2.z = p0.x*p1.y-p0.y*p1.x;
	return p2;
}
void cal(int cnt,point p0,point p1,point p2)
{
	double a = dist(p0,p1);
	double b = dist(p1,p2);
	double c = dist(p0,p2);
    double d = (a+b+c)/2.0;
	area[cnt]=sqrt(d*(d-a)*(d-b)*(d-c));
	p1.x-=p0.x,p1.y-=p0.y,p1.z-=p0.z;
	p2.x-=p0.x,p2.y-=p0.y,p2.z-=p0.z;
	point p3 = cross(p1,p2);
	pm[cnt].a = p3.x,pm[cnt].b = p3.y,pm[cnt].c = p3.z;
	pm[cnt].d = -(pm[cnt].a*p0.x+pm[cnt].b*p0.y+pm[cnt].c*p0.z);
}

int main()
{
    while(scanf("%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf",&p[0].x,&p[0].y,&p[0].z,&p[1].x,&p[1].y,&p[1].z,&p[2].x,&p[2].y,&p[2].z,&p[3].x,&p[3].y,&p[3].z)!=EOF)
	{
        if(!(check(p[0],p[1],p[2]) && check(p[0],p[2],p[3]) && check(p[0],p[1],p[3]) && check(p[1],p[2],p[3])))
		{
            printf("O O O O\n");
			continue;
		}
		cal(3,p[0],p[1],p[2]);
		cal(2,p[0],p[1],p[3]);
		cal(1,p[0],p[2],p[3]);
		cal(0,p[1],p[2],p[3]);
		double r = area[3]*pointoplaneDist(p[3].x,p[3].y,p[3].z,pm[3].a,pm[3].b,pm[3].c,pm[3].d)/(area[0]+area[1]+area[2]+area[3]);
		if(r<1e-9)
		{
			printf("O O O O\n");
			continue;
		}
		point ans;
		ans.x = (area[0]*p[0].x+area[1]*p[1].x+area[2]*p[2].x+area[3]*p[3].x)/(area[0]+area[1]+area[2]+area[3]);
		ans.y = (area[0]*p[0].y+area[1]*p[1].y+area[2]*p[2].y+area[3]*p[3].y)/(area[0]+area[1]+area[2]+area[3]);
		ans.z = (area[0]*p[0].z+area[1]*p[1].z+area[2]*p[2].z+area[3]*p[3].z)/(area[0]+area[1]+area[2]+area[3]);
		printf("%.4lf %.4lf %.4lf %.4lf\n",ans.x,ans.y,ans.z,r);
	}
}




Problem Description

Given four points ABCD, if ABCD is a tetrahedron, calculate the inscribed sphere of ABCD.

Input

≤100).

Each test cases contains a line of 12 integers  [−1e6,1e6] indicate the coordinates of four vertices of ABCD.

Input ends by EOF.

Output

Print the coordinate of the center of the sphere and the radius, rounded to 4 decimal places.

If there is no such sphere, output "O O O O".

Sample Input

0 0 0 2 0 0 0 0 2 0 2 0 
0 0 0 2 0 0 3 0 0 4 0 0

Sample Output

0.4226 0.4226 0.4226 0.4226
O O O O

Author

HIT

Source

2016 Multi-University Training Contest 1