求四面体体积

传送门

溪染:喂,叁秋,我这里有空间上4个点的坐标,你能帮我求出他们构成四面体的体积吗?
叁秋:我试试!
叁秋发现自己不会算,直接说自己不会又觉得很没面子,于是她找到了你。

输入描述:

共四行,每行输入3个参数,x,y,z(−50≤x,y,z≤50)表示点的坐标,输入的坐标均为整数。
输入保证,四个点的坐标可以构成四面体。(不会出现四点共面的情况)

输出描述:

仅一行一个实数,表示构成四面体的体积,你的答案正确,当且仅当你的答案与实际答案之间的误差不大于10e4。
示例1

输入

复制
0 0 0
0 3 0
4 0 0
0 0 4

输出

复制
8.00000000000000
示例2

输入

复制
-1 -49 -20
-25 -6 12
38 -45 -29
-30 -37 -12

输出

复制
2189.1666666666666667



#include<iostream>
#include<algorithm>
#include<string.h>
#include<string>
#include<stdio.h>
#include<math.h>
#define ll long long
#define INF 2147483647
#define N 50
#define PI acos(-1)
#define EPS 1e-8
using namespace std;


struct point
{
    double x,y,z;
} p[5];


double line2(point a,point b)
{
    return ((a.x-b.x)*(a.x-b.x))+((a.y-b.y)*(a.y-b.y))+((a.z-b.z)*(a.z-b.z));
}
int main()
{
        for(int i=1; i<=4; i++)
            cin>>p[i].x>>p[i].y>>p[i].z;
        double p12=line2(p[1],p[2]),p13=line2(p[1],p[3]),p14=line2(p[1],p[4]);
        double p23=line2(p[2],p[3]),p24=line2(p[2],p[4]),p34=line2(p[3],p[4]);
        double res1=p12*p34*(p13+p14+p23+p24-p12-p34);
        double res2=p14*p23*(p12+p13+p24+p34-p14-p23);
        double res3=p13*p24*(p12+p14+p23+p34-p13-p24);
        double res4=(p12*p13*p23)+(p13*p14*p34)+(p12*p14*p24)+(p24*p34*p23);
        double v=sqrt(res1+res2+res3-res4)/12;
        printf("%.2lf\n",v);
    
    return 0;
}

 

posted @ 2021-06-20 00:27  lipu123  阅读(278)  评论(0)    收藏  举报