我需要根据四个角点的坐标来计算四面体的体积。
答案 0 :(得分:16)
假设您有4个顶点a,b,c,d(3-D向量)。
现在,问题归结为编写代码来解决向量的交叉积和点积。如果你来自python,你可以使用NumPy,否则你可以自己编写代码。
维基百科链接绝对可以帮助您。 LINK
答案 1 :(得分:9)
计算此卷的一种方法是:
1 [ax bx cx dx]
V = --- det [ay by cy dy]
6 [az bz cz dz]
[ 1 1 1 1]
这涉及4×4行列式的评估。它很好地概括了更高维度的单纯形,其中6是 n!的特殊情况,是维度的阶乘。得到的体积将是取向,即取决于点的顺序可能是负的。如果您不想这样,请取结果的绝对值。
如果你手头有一个数学库,上面的表述可能是最容易写下来的,并且软件可以从那里获取。如果没有,您可以先从 a 到 c 中减去 d 坐标来简化操作。这不会改变音量,但会将最右边的列转换为(0, 0, 0, 1)
。因此,您可以简单地将矩阵的值计算为左上3×3子矩阵的行列式。并使用等式
det(a,b,c)= a·(b×c)
您最终获得了来自Surya's answer的公式。
如果您没有点的坐标,而只是它们之间的距离,请查看Tartaglia's Formula,这是上述的平方版本,尽管它不像它看起来那样直截了当乍一看。
答案 2 :(得分:5)
Ivan Seidel的例子,用Python(答案是1.3333 ......)
def determinant_3x3(m):
return (m[0][0] * (m[1][1] * m[2][2] - m[1][2] * m[2][1]) -
m[1][0] * (m[0][1] * m[2][2] - m[0][2] * m[2][1]) +
m[2][0] * (m[0][1] * m[1][2] - m[0][2] * m[1][1]))
def subtract(a, b):
return (a[0] - b[0],
a[1] - b[1],
a[2] - b[2])
def tetrahedron_calc_volume(a, b, c, d):
return (abs(determinant_3x3((subtract(a, b),
subtract(b, c),
subtract(c, d),
))) / 6.0)
a = [0.0, 0.0, 0.0]
d = [2.0, 0.0, 0.0]
c = [0.0, 2.0, 0.0]
b = [0.0, 0.0, 2.0]
print(tetrahedron_calc_volume(a, b, c, d))
答案 3 :(得分:1)
以下是用PHP计算任意四面体的体积给出4分的代码:
class Math{
public static function determinant(array $vals){
$s = sizeof($vals);
$sum = 0.0;
for( $i=0; $i < $s ; $i++ ){
$mult = 1.0;
for($j=0; $j < $s ; $j++ ){
$mult *= $vals[$j][ ($i+$j)%$s ];
}
$sum += $mult;
}
for( $i=0; $i < $s ; $i++ ){
$mult = 1;
for($j=0; $j < $s ; $j++ ){
$mult *= $vals[$j][ ($i-$j < 0? $s - ($j-$i) :($i-$j)) ];
}
$sum -= $mult;
}
return $sum;
}
public static function subtract(array $a, array $b){
for($i = 0; $i < sizeof($a); $i++)
$a[$i] -= $b[$i];
return $a;
}
}
// TEST CASE
$a = array(0,0,0);
$d = array(2,0,0);
$c = array(0,2,0);
$b = array(0,0,2);
echo abs(Math::determinant(array(
Math::subtract($a, $b),
Math::subtract($b, $c),
Math::subtract($c, $d),
)))/6;