Условие:
Найти угол в градусах, минутах и секундах между векторами [latex]\overrightarrow{a}=(a_x,a_y,a_z)[/latex] и [latex]\overrightarrow{b}=(b_x,b_y,b_z)[/latex].
Входные данные:
Координаты векторов [latex] \overrightarrow{a}[/latex] и [latex]\overrightarrow{b}[/latex].
Выходные данные:
Угол в градусах, минутах и секундах.
Тесты
№ | Входные данные | Выходные данные |
1 | 1 1 4 20 31 12 | 53° 1′ 23″ |
2 | 1 61 12 1 11 1 | 7° 17′ 33″ |
3 | 1 0 0 0 0 1 | 90° 0′ 0″ |
4 | -1 0 1 -2 2 1 | 44° 59′ 59″ |
Код
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#define _USE_MATH_DEFINES #include #include using namespace std; int main() { double ax, ay, az, bx, by, bz, mdla, mdlb, mdlab, ccos, ugl; int gr = 0,mn=0, sc=0; cin >> ax >> ay >> az >> bx >> by >> bz; mdla = sqrt(ax*ax + ay*ay + az*az); //формула длины вектора mdlb = sqrt(bx*bx + by*by + bz*bz); mdlab = mdla*mdlb; ccos = (ax*bx + ay*by + az*bz) / mdlab; // формула косинус угла между векторами ugl = acos(ccos)*180/M_PI;// получим угол по формуле перевода радиан в градусы gr = ugl; // найдем градусы ugl -= gr; mn = ugl * 60; // оставшаяся часть угла в минутах ugl -= (double)mn / 60; sc = ugl * 3600; // оставшаяся часть угла в секундах cout << gr << "° " << mn << "' " << sc << "''"; return 0; } |
Решение:
Для решения данной задачи необходимо найти косинус между векторами, а после перевести радианы в градусы.
Косинус между векторами найдем по формуле [latex] \cos \alpha = \frac{\vec{a}\vec{b}}{\left|\vec{a} \right|\left|\vec{b} \right|}[/latex] .
Скалярное произведение найдем по формуле [latex] \left|\vec{a} \right| \left|\vec{b} \right|={a}_{x}{b}_{x}+{a}_{y}{b}_{y}+{a}_{z}{b}_{z} [/latex] .
Модуль вектора найдем по формуле [latex] \left|\vec{a} \right| = \sqrt{ {{a}_{x}}^{2}+{{a}_{y}}^{2}+{{a}_{z}}^{2} } [/latex] ; [latex] \left|\vec{b} \right| = \sqrt{ {{b}_{x}}^{2}+{{b}_{y}}^{2}+{{b}_{z}}^{2} } [/latex] .
Затем переведем радианы в градусы по формуле [latex] \frac{180}{ \arccos (-1.0) \arccos (\cos \alpha )} [/latex] .
[latex] \arccos (-1.0) [/latex] это число [latex] \pi [/latex] .
Ссылки:
Решение задачи на ideone.com: http://ideone.com/Gx3IVU
Косинус угла между векторами: http://ru.onlinemschool.com/math/library/vector/angl/
Скалярное произведение векторов: http://ru.onlinemschool.com/math/library/vector/multiply/
Модуль вектора: http://ru.onlinemschool.com/math/library/vector/length/
Перевод радиан в градусы: http://www.cleverstudents.ru/trigonometry/radian_and_degree_conversion.html
Условие задачи: https://cpp.mazurok.com/mtasks/
— Сделайте правильные отступы в коде.
— Для задания числа [latex]\pi[/latex] нужно использовать константу M_PI.
— Не используйте, пожалуйста, символы кириллицы в постоянных ссылках.
— Нет ни одной причины использовать циклы.
— Посмотрите, как оформлены все ссылки на этой страничке или других сайтах в сети. Обычно стараются не публиковать явно динные бессмысленные URL (адрес перехода). Этот текст не несет смысловой нагрузки и читатель не должен его видеть. Гиперссылки нужно вставлять прямо в текст в тех местах где впервые встречается, например, скалярное произведение. Но не выносить все ссылки в канец страницы.
— Зачем давать ссылку на условие задачи если Вы его приводите полностью? Тем более, что условие находится на нашем сайте на странице с сотней других задач. Для кого эта ссылка?
— Чтобы напечатать строку, содержащую двойные кавычки, нужно экранировать этот символ наклонной чертой — \». Выглядит странновато — «\»», но второй способ ещё «страньше» 😉
— В коде на ideone отступов нет вообще.
— Как влияет первая строка на работу Вашей программы?
И самое главное. Программа, приведенная в тексте статьи, не компилируется. По ссылке на IDEOne открывается совсем другая программа, которая компилируется, но работает неверно. С её точки зрения угол между двумя противонаправленными векторами (0,0,1) и (0,0,-1) составляет 180° 42′ 49».
Почему Вы отправляете это мне на проверку?