题目意思很明确,知道四面体六条棱长求体积。
数学问题,我们把四面体四个顶点放到坐标系中,并把A点设为原点,B坐标(x1,0,0),C坐标(x2,y2,0),D坐标(x3,y3,z3)。由于6条边,可以列出6个方程,因此可以解出x1,x2,y2,x3,y3,z3。而z3就是ABC面上的高。把ABC面积乘以z3再除以3就是答案了。
数学问题,我们把四面体四个顶点放到坐标系中,并把A点设为原点,B坐标(x1,0,0),C坐标(x2,y2,0),D坐标(x3,y3,z3)。由于6条边,可以列出6个方程,因此可以解出x1,x2,y2,x3,y3,z3。而z3就是ABC面上的高。把ABC面积乘以z3再除以3就是答案了。
#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
int main()
{
long double AB,AC,AD,BC,BD,CD;
long double x2,y2_2,x3,y3_2,z3;
long double AB_2,AC_2,AD_2;
long double S,V;
while(cin>>AB>>AC>>AD>>BC>>BD>>CD)
{
AB_2 = AB*AB;
AC_2 = AC*AC;
AD_2 = AD*AD;
x2 = (AC_2 - BC*BC + AB_2) / 2 / AB;
x3 = (AD_2 - BD*BD + AB_2) / 2 / AB;
y2_2 = AC_2 - x2*x2;
S = AD_2 - CD*CD + AC_2 - 2*x2*x3;
y3_2 = S*S / 4 / y2_2;
z3 = sqrtl(AD_2 - x3*x3 - y3_2);
V = (AB+BC+AC) / 2;
S = sqrtl(V*(V-AB)*(V-BC)*(V-AC));
V = S * z3 / 3;
if(V > 1e-10) cout<<setiosflags(ios::fixed)<<setprecision(4)<<V<<endl;
else cout<<"0.0000\n";
}
return 0;
}
#include<iomanip>
#include<cmath>
using namespace std;
int main()
{
long double AB,AC,AD,BC,BD,CD;
long double x2,y2_2,x3,y3_2,z3;
long double AB_2,AC_2,AD_2;
long double S,V;
while(cin>>AB>>AC>>AD>>BC>>BD>>CD)
{
AB_2 = AB*AB;
AC_2 = AC*AC;
AD_2 = AD*AD;
x2 = (AC_2 - BC*BC + AB_2) / 2 / AB;
x3 = (AD_2 - BD*BD + AB_2) / 2 / AB;
y2_2 = AC_2 - x2*x2;
S = AD_2 - CD*CD + AC_2 - 2*x2*x3;
y3_2 = S*S / 4 / y2_2;
z3 = sqrtl(AD_2 - x3*x3 - y3_2);
V = (AB+BC+AC) / 2;
S = sqrtl(V*(V-AB)*(V-BC)*(V-AC));
V = S * z3 / 3;
if(V > 1e-10) cout<<setiosflags(ios::fixed)<<setprecision(4)<<V<<endl;
else cout<<"0.0000\n";
}
return 0;
}