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, в результате чего оно станет положительным.
- A334(а). Вложенная сумма - 31.03.2017
- А58б. Нахождение значения функции - 31.03.2017
- ML28. Объём тетраэдра - 26.03.2017
— Отступы в программировании очень важны для того, кто будут читать Ваш код. крупные компании не ленятся готовить инструкции на несколько десятков страниц с объяснениями по стилю оформления кода. Это экономит очень много времени при его поддержке.
— Сделайте, пожалуйста, ссылку для запуска кода на сайте try.haxe.com.
Кажется все исправил
Принято. Хотя можно было и проще.