Cсылка на первоначальное решение тут
Задача
Найти объём тетраэдра три стороны которого образованы векторами
$\vec {a} = \left( x_a, y_a, z_a \right)$
$\vec {b} = \left( x_b, y_b, z_x \right)$
$\vec {c} = \left( x_c, y_c, z_c \right).$
Пояснительный рисунок

Входные данные
Координаты векторов $\vec {a}$,$\vec {b}$, $\vec {c}$
Выходные данные
Объём тетраэдра
Входные данные |
Выходные данные |
$x_a$ |
$y_a$ |
$z_a$ |
$x_b$ |
$y_b$ |
$z_b$ |
$x_c$ |
$y_c$ |
$z_c$ |
V |
0 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
0 |
0.166667 |
3 |
6 |
3 |
1 |
3 |
-2 |
2 |
2 |
2 |
3 |
0 |
0 |
0 |
1 |
3 |
-2 |
2 |
2 |
2 |
0 |
Код программы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
Class Main { static function main() { var V :Float; var Ax:Float = Std.parseFloat(Sys.stdin().readLine());//Считывание координат векторов. var Ay:Float = Std.parseFloat(Sys.stdin().readLine()); var Az:Float = Std.parseFloat(Sys.stdin().readLine()); var Bx:Float = Std.parseFloat(Sys.stdin().readLine()); var By:Float = Std.parseFloat(Sys.stdin().readLine()); var Bz:Float = Std.parseFloat(Sys.stdin().readLine()); var Cx:Float = Std.parseFloat(Sys.stdin().readLine()); var Cy:Float = Std.parseFloat(Sys.stdin().readLine()); var Cz:Float = Std.parseFloat(Sys.stdin().readLine()); V = (Ax * (By * Cz - Bz * Cy) - Bx * (Ay * Cz - Az * Cy) + Cx * (Ay * Bz - Az * By)) / 6.0; //Подсчитывание объёма. if (V < 0) { V *= -1; //Определитель матрицы может быть отрицательным числом, объём - нет. Поэтому если объём отрицательный, умножаем его на -1. } trace(V); //Вывод объёма. } } |
Решение задачи
Так как тетраэдр построен на векторах $\vec {a} = \left( x_a, y_a, z_a \right)$ $\vec {b} = \left( x_b, y_b, z_x \right)$ $\vec {c} = \left( x_c, y_c, z_c \right)$ для данной задачи оптимальным решением будет использовать следующие формулы:
$V=|Δ|/6$ где $V$ обьем тетраэдра а $Δ$ определитель матрицы.
Δ = \begin{vmatrix} x_a & y_a & z_a \\ -x_b & y_b & z_b \\ x_c & y_c & z_c
\end{vmatrix}
= $x_a \left(y_b z_c-z_b y_c \right)-x_b \left( y_a z_c-z_a y_c \right)+x_c \left( y_a z_b-z_a y_b \right)$
- если значение определителя матрицы равно нулю, то либо некоторые из заданных векторов коллинеарны, либо нулевые, либо все они лежат в одной плоскости. Во всех этих случаях тетраэдр не может существовать, и программа выведет 0;
- если значение определителя не равно нулю, то программа вычислит объём тетраэдра. В случае, если определитель примет отрицательное значение, программа домножит значение объёма на −1, в результате чего оно станет положительным.
Решение на Try Haxe!