Рассчитать объем любого тетраэдра с учетом 4 баллов - PullRequest
8 голосов
/ 26 марта 2012

Мне нужно рассчитать объем тетраэдра, учитывая координаты его четырех угловых точек.

Ответы [ 4 ]

16 голосов
/ 26 марта 2012

Скажите, если у вас есть 4 вершины a, b, c, d (трехмерные векторы).

enter image description here

Теперь проблема сводится к написанию кода, который решает перекрестное произведение и точечное произведение векторов. Если вы из Python, вы можете использовать NumPy или написать самостоятельно.

Ссылка на Википедию определенно должна вам помочь. LINK

9 голосов
/ 20 сентября 2012

Один из способов вычислить этот объем таков:

     1      [ax bx cx dx]
V = --- det [ay by cy dy]
     6      [az bz cz dz]
            [ 1  1  1  1]

Это включает в себя оценку определителя 4 × 4. Он хорошо обобщается на симплексы более высоких измерений, причем 6 является частным случаем n! , факториала измерения. Результирующий объем будет ориентирован , то есть может быть отрицательным в зависимости от порядка точек. Если вы этого не хотите, возьмите абсолютное значение результата.

Если у вас есть математическая библиотека под рукой, приведенная выше формулировка может оказаться одной из самых простых для записи, и программное обеспечение может ее взять. Если нет, вы могли бы сначала упростить задачу, вычтя координаты d из a через c . Это не изменит громкость, но превратит самый правый столбец в (0, 0, 0, 1). В результате вы можете вычислить значение матрицы просто как определитель верхней левой подматрицы 3 × 3. И используя уравнение

дет (а, б, в) = а · (б × в)

вы получите формулу из ответа Сурьи .

В случае, если у вас нет координат для точек, а есть только расстояния между ними, посмотрите на Формула Тарталья , которая по сути является квадратичной версией вышеупомянутого, хотя и не так прямолинейна, как казалось бы на первый взгляд.

5 голосов
/ 21 апреля 2013

Пример Ивана Зейделя, на 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))
1 голос
/ 26 марта 2012

Вот код в 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...