Задача
Найти объём тетраэдра три стороны которого образованы векторами [latex]\vec {a} = \left( x_a, y_a, z_a \right)[/latex], [latex]\vec {b} = \left( x_b, y_b, z_x \right)[/latex], [latex]\vec {c} = \left( x_c, y_c, z_c \right)[/latex].
Пояснительный рисунок
Входные данные
Координаты векторов [latex]\vec {a}[/latex], [latex]\vec {b}[/latex], [latex]\vec {c}[/latex].
Выходные данные
Объём тетраэдра.
Тесты
Входные данные | Выходные данные | ||||||||
---|---|---|---|---|---|---|---|---|---|
[latex]x_a[/latex] | [latex]y_a[/latex] | [latex]z_a[/latex] | [latex]x_b[/latex] | [latex]y_b[/latex] | [latex]z_b[/latex] | [latex]x_c[/latex] | [latex]y_c[/latex] | [latex]z_c[/latex] | [latex]V[/latex] |
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 |
#include <iostream> using namespace std; int main() { double Ax, Ay, Az, Bx, By, Bz, Cx, Cy, Cz, V; cin >> Ax >> Ay >> Az >> Bx >> By >> Bz >> Cx >> Cy >> Cz; //Считывание координат векторов. V = (Ax * (By * Cz - Bz * Cy) - Bx * (Ay * Cz - Az * Cy) + Cx * (Ay * Bz - Az * By)) / 6.0; //Подсчитывание объёма. if (V < 0) V *= -1; //Определитель матрицы может быть отрицательным числом, объём - нет. Поэтому если объём отрицательный, умножаем его на -1. cout << V; //Вывод объёма. } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
import java.util.*; public class Main { public static void main (String[] args) throws java.lang.Exception { Scanner in = new Scanner(System.in); double Ax = in.nextDouble(), Ay = in.nextDouble(), Az = in.nextDouble(), Bx = in.nextDouble(), By = in.nextDouble(), Bz = in.nextDouble(), Cx = in.nextDouble(), Cy = in.nextDouble(), Cz = in.nextDouble(); double V = (Ax * (By * Cz - Bz * Cy) - Bx * (Ay * Cz - Az * Cy) + Cx * (Ay * Bz - Az * By)) / 6.0; if (V < 0) V *= -1; System.out.print(V); } } |
Решение задачи
Так как тетраэдр построен на векторах [latex]\vec {a} = \left( x_a, y_a, z_a \right)[/latex], [latex]\vec {b} = \left( x_b, y_b, z_x \right)[/latex], [latex]\vec {c} = \left( x_c, y_c, z_c \right)[/latex], для данной задачи оптимальным решением будет использовать следующие формулы:
- [latex]V = \frac {|\Delta|} {6}[/latex], где [latex]V[/latex] — объём тетраэдра, а [latex]\Delta[/latex] — определитель матрицы.
- [latex]
\Delta =
\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)
[/latex].
Итоги:
- если значение определителя матрицы равно нулю, то либо некоторые из заданных векторов коллинеарны, либо нулевые, либо все они лежат в одной плоскости. Во всех этих случаях тетраэдр не может существовать, и программа выведет [latex]0[/latex];
- если значение определителя не равно нулю, то программа вычислит объём тетраэдра. В случае, если определитель примет отрицательное значение, программа домножит значение объёма на [latex]-1[/latex], в результате чего оно станет положительным.
Хорошо получилось.
— Давайте будем считать, что при нулевом объёме тетраэдр существует, но он вырожденный. Т.е. просто выводите 0. Иначе выходит нелогично — просят вычислить объём (число), а иногда получают текст на каком-то экзотическом языке.
— Уберите, пожалуйста, символы кириллицы из постоянной ссылки. Можно оставить просто номер задачи.
— Здорово было бы сделать чертёж. Хотя бы для практики в SVG. Но я не настаиваю.
Спасибо за советы. Сделано.
Не могу понять рисункв. В условия заданы вектора [latex]\vec{a}, \vec{b}, \vec{c}[/latex], а на рисунке, что-то похожее на оси координат и вектора вдоль них. Посмотрите, пожалуйста, как всё выглядит здесь. Может возникнут идеи по простой переделке рисунка.
Понял. Исправил.
Вы удалили кусок текста. Все предыдущие версии есть в истории корректировок откуда можно взять потерянную часть.
Видимо когда стирал минус в определителе матрицы, задел вместе с ним половину решения.
Спасибо большое, что уведомили об этом.