Задача. Найти площадь полной поверхности тетраэдра три стороны которого образованы векторами [latex]\overrightarrow{a}=(a_x,a_y,a_z)[/latex], [latex] \overrightarrow{b}=(b_x,b_y,b_z)[/latex] и [latex]\overrightarrow{c}=(c_x,c_y,c_z)[/latex].
Тесты:
№ | Вход | Выход | ||||||||
---|---|---|---|---|---|---|---|---|---|---|
[latex]a_x[/latex] | [latex]a_y[/latex] | [latex]a_z[/latex] | [latex]b_x[/latex] | [latex]b_y[/latex] | [latex]b_z[/latex] | [latex]c_x[/latex] | [latex]c_y[/latex] | [latex]c_z[/latex] | [latex]S[/latex] | |
1 | -3 | 3 | 3 | 3 | -3 | 3 | 3 | 3 | -3 | 69.3607 |
2 | -1 | 1 | 1 | 1 | -1 | 1 | 1 | 1 | -1 | 7.70674 |
3 | -2 | 2 | 2 | 2 | -2 | 2 | 2 | 2 | -2 | 30.827 |
4 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | -1 | 2.07313 |
Код на C++:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
#include <iostream> #include <cmath> using namespace std; int main() { double ax, ay, az, bx, by, bz, cx, cy, cz;//обозначим переменные cin >> ax >> ay >> az >> bx >> by >> bz >> cx >> cy >> cz;//введём переменные double A1A2 = sqrt(ax*ax+ay*ay+az*az); //вычислим длину ребра А1A2 double A1A3 = sqrt(bx*bx+by*by+bz*bz);//вычислим длину ребра А1A3 double cosa =(ax*bz+ay*by+az*bz)/(A1A2*A1A3);//вычислим косинус угла между ребрами А1A2 и А1A3 double sina =sqrt(1-cosa*cosa);//вычислим их синус double s1 = 0.5*A1A2*A1A3*sina;//найдём площадь поверхности double A1A4 = sqrt(cx*cx+cy*cy+cz*cz);//вычислим длину ребра А1A4 double cosb =(ax*cx+ay*cy+az*cz)/(A1A2*A1A4);//вычислим косинус угла между ребрами А1A2 и А1A4 double sinb =sqrt(1-cosb*cosb);//вычислим их синус double s2 = 0.5*A1A2*A1A4*sinb;//найдём площадь поверхности double cosc =(bx*cx+by*cy+bz*cz)/(A1A2*A1A3);//вычислим косинус угла между ребрами А1A3 и А1A4 double sinc =sqrt(1-cosc*cosc);//вычислим их синус double s3 = 0.5*A1A3*A1A4*sinc;//найдём площадь поверхности double A2A3 = sqrt((cx-bx)*(cx-bx)+(cy-by)*(cy-by)+(cz-bz)*(cz-bz));//вычислим длину ребра А2A3 double A2A4 = sqrt((cx-ax)*(cx-ax)+(cy-ay)*(cy-ay)+(cz-az)*(cz-az));//вычислим длину ребра А2A4 double cosd =((cx-bx)*(cx-ax)+(cy-ay)*(cy-by)+(cz-az)*(cz-bz))/(A2A3*A2A4);//вычислим косинус угла между ребрами А2A3 и А2A4 double sind =sqrt(1-cosd*cosd);//вычислим их синус double s4 = 0.5*A2A3*A2A4*sind;//найдём площадь поверхности double s = s1+s2+s3+s4;//найдём площадь полной поверхности cout << s ;//выведем её результат return 0; } |
Код на Java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
import java.util.*; import java.lang.*; import java.io.*; class Main{ public static void main (String[] args) throws java.lang.Exception{ Scanner in = new Scanner(System.in); PrintWriter out = new PrintWriter(System.out); double ax = in.nextDouble(); double ay = in.nextDouble(); double az = in.nextDouble(); double bx = in.nextDouble(); double by = in.nextDouble(); double bz = in.nextDouble(); double cx = in.nextDouble(); double cy = in.nextDouble(); double cz = in.nextDouble(); double A1A2 = Math.sqrt(ax*ax+ay*ay+az*az); //вычислим длину ребра А1A2 double A1A3 = Math.sqrt(bx*bx+by*by+bz*bz);//вычислим длину ребра А1A3 double cosa =(ax*bz+ay*by+az*bz)/(A1A2*A1A3);//вычислим косинус угла между ребрами А1A2 и А1A3 double sina = Math.sqrt(1-cosa*cosa);//вычислим их синус double s1 = 0.5*A1A2*A1A3*sina;//найдём площадь поверхности double A1A4 = Math.sqrt(cx*cx+cy*cy+cz*cz);//вычислим длину ребра А1A4 double cosb =(ax*cx+ay*cy+az*cz)/(A1A2*A1A4);//вычислим косинус угла между ребрами А1A2 и А1A4 double sinb = Math.sqrt(1-cosb*cosb);//вычислим их синус double s2 = 0.5*A1A2*A1A4*sinb;//найдём площадь поверхности double cosc =(bx*cx+by*cy+bz*cz)/(A1A2*A1A3);//вычислим косинус угла между ребрами А1A3 и А1A4 double sinc = Math.sqrt(1-cosc*cosc);//вычислим их синус double s3 = 0.5*A1A3*A1A4*sinc;//найдём площадь поверхности double A2A3 = Math.sqrt((cx-bx)*(cx-bx)+(cy-by)*(cy-by)+(cz-bz)*(cz-bz));//вычислим длину ребра А2A3 double A2A4 = Math.sqrt((cx-ax)*(cx-ax)+(cy-ay)*(cy-ay)+(cz-az)*(cz-az));//вычислим длину ребра А2A4 double cosd =((cx-bx)*(cx-ax)+(cy-ay)*(cy-by)+(cz-az)*(cz-bz))/(A2A3*A2A4);//вычислим косинус угла между ребрами А2A3 и А2A4 double sind = Math.sqrt(1-cosd*cosd);//вычислим их синус double s4 = 0.5*A2A3*A2A4*sind;//найдём площадь поверхности double s = s1+s2+s3+s4;//найдём площадь полной поверхности System.out.println(s) ;//выведем её результат } } |
Решение:
Координаты векторов находим по формуле:
[latex] \overrightarrow{A_2A_4}=(c_x-a_x,c_y-a_y,c_z-a_z) [/latex]
здесь [latex] a_x, a_y, a_z[/latex] — координаты точки [latex]A_2[/latex]; [latex]c_x, c_y, c_z[/latex] — координаты точки [latex]A_4[/latex];
Таким же образом находим остальные координаты векторов.
Модули векторов (длина ребер пирамиды)
Длина вектора [latex]\overrightarrow{a}(a_x;a_y;a_z)[/latex] выражается через его координаты формулой:
[latex] \left| \overrightarrow{A_1A_2} \right| =\sqrt { ({ a_x) }^{ 2 }+({ a_y) }^{ 2 }+({ a_z) }^{ 2 } } [/latex];
Таким же способом находим другие модули векторов.
Площадь грани можно найти по формуле:
[latex] s_1=\frac { 1 }{ 2 } \vec{A_1} \times \vec{A_2} \sin \angle{A_2A_3} [/latex]
где
[latex] \sin \angle{ A_2A_3 =\sqrt { 1-{ (\cos \angle{ A_2A_3) } }^{ 2 } } } [/latex]
Так же будем находить и другие.
Найдем угол между ребрами [latex] A_1A_2(a_x;a_y;a_z) [/latex] и [latex] A_1A_3(b_x;b_y;b_z) [/latex]:
[latex] \cos \angle{ A_2A_3 =\frac { a_x b_x+a_y b_y+a_z b_z }{ \left| A_2A_3 \right| } } [/latex]
Так мы найдём и другие 3 площади граней.
Площадь полной поверхности.
[latex] s=s_1+s_2+s_3+s_4. [/latex]
Ссылки:
Онлайн компилятор ideone C++ .
Онлайн компилятор ideone Java .
Онлайн калькулятор .
— Тесты готовят до написания программы и разместить их нужно до кода.
— Необходимо добавить описание решения.
— Вы забыли про ключевые слова (метки).
— Постоянная ссылка на статью (адрес) содержит символы кириллицы. Это нежелательно. Вполне достаточно указать ML29.
— Ваш рисунок тетраэдра требует пяти обычных отрезков и одного пунктирного. Конечно, придётся нарисовать на листочке 4 точки и придумать им координаты. Вместо этого Вы видимо нарисовали что-то мышкой в растровом формате и конвертировали его в SVG. Если Вы откроете свой рисунок в текстовом редакторе (например, notepad), то ломанные линии с многими сотнями точек. Удалите их и напишите либо 6 отрезков, либо отрезок и ломанную по своим координатам. Здесь написано как это сделать.
Хорошо. Программа похоже работает верно.
По технике выполнения рисунка замечаний больше нет. Есть замечания по сути.
— Вы оставили двухмерную систему координат из образца и дорисовали трехмерный рисунок. Даже начала координат у них не совпадают. простейший способ избавиться от противоречия — убрать лишнее.
— Все надписи должны быть выполнены в таком стиле, как обозначения осей координат. Сейчас обозначения векторов на рисунке и в тексте различаются по начертанию.
— По коду тоже есть замечание. Вам не захотелось сделать вспомогательную функцию чтобы не писать много раз похожий код?
— Зачем Вы постоянно отнимаете ноль? Зачем вычислять координаты векторов если они заданы в условии?
— У вас какой-то мусор в тексте — вдруг какой-то нолик болтается или буква «в».
— Если Вы хотите нумеровать абзацы (например, собираетесь на эти номера ссылаться), то лучше это делать при помощи кнопок OL (ordered list) и LI (list item) или просто указывая соответствующие теги в тексте.
— Вам не кажется, что подпись «Рисунок» возле рисунка не несёт дополнительной информации?
В самом конце работы написано «Условие задачи ML29». Зачем? Условие ведь приведено в самом начале.
— В самом конце вы даёте ссылку не на свой кода на ideone.com, а на главную страницу сайта. Исправьте, пожалуйста.
— Вы иногда не включаете нижние индексы. Например, [latex]s1[/latex] вместо [latex]S_{1}[/latex].
— Посмотрите здесь как обозначаются углы и скалярные произведения.
— Постоянная ссылка на статью (адрес) содержит символы кириллицы. Это нежелательно. Вполне достаточно указать ML29.
Извините, мне почти невозможно комментировать каждый ошибочный символ более детально, чем я делал до сих пор. Либо прочтите свой текст и комментарии, либо подойдите на консультацию в субботу или после любой нашей пары — буду показывать пальцем.
Вроде всё изменила верно. Проверьте, пожалуйста.
— Жаль с функциями не вышло — много повторяющегося кода. Но уж ладно.
— Я проверил в Google, эта Ваша загадочная фраза «добавим математические операции» нигде больше в Интернете не встречается. Нужно поставить копирайт, пока не разошлось по сети 🙂
— Точки на рисунке должны быть обозначены так, как в тексте — [latex]A_1, A_2, A_3, A_4.[/latex]
— После символа угла Вы включаете прямой жирный шрифт для буквы А. Что Вы хотите этим сказать? Нет, не отвечайте, просто уберите там \mathbf.
Сделайте, пожалуйста, правильные отступы в коде на Java.