Задача
Конус расположен в трехмерном пространстве так, что его основание радиуса [latex] r [/latex] лежит в плоскости [latex] z = 0 [/latex] с центром в [latex] (0,0,0) [/latex]. Вершина конуса расположена в [latex] (0, 0, h) [/latex]. На его поверхности заданы две точки в конусных координатах. Конусной координатой точки называется пара чисел [latex] (d, A) [/latex], где [latex] d [/latex] — расстояние от вершины конуса до точки [latex] p [/latex], а [latex] A (A < 360) [/latex] — угол в градусах между плоскостью [latex] y = 0 [/latex] и плоскостью, проходящей через точки [latex] (0,0,0), (0,0,h) [/latex] и [latex] p [/latex], считая против часовой стрелки от направления оси [latex] x [/latex].
На поверхности конуса заданы две точки [latex] p1 = (d1, A1) [/latex] и [latex] p2 = (d2, A2) [/latex]. Найти кратчайшее расстояние между [latex] p1 [/latex] и [latex] p2 [/latex], измеряемое по поверхности конуса.
Входные данные
Каждая строка является отдельным тестом и содержит 6 действительных чисел: [latex] r, h, d1, A1, d2 [/latex] и [latex] A2 [/latex].
Выходные данные
Для каждого теста в отдельной строке вывести кратчайшее расстояние между точками [latex] p1 [/latex] и [latex] p2 [/latex] по поверхности конуса. Расстояние выводить с 2 десятичными знаками.
Тесты
№ | Ввод | Вывод |
1 |
3.0 4.0 2.0 0.0 4.0 0.0 |
2.00 |
2 |
3.0 4.0 2.0 90.0 4.0 0.0 |
3.26 |
3 |
6.0 8.0 2.14 75.2 9.58 114.3 |
7.66 |
4 |
3.0 4.0 5.0 0.0 5.0 90.0 |
4.54 |
Код программы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#include <iostream> #include <iomanip> #include <math.h> #include <cmath> using namespace std; int main() { double r, h, d1, A1, d2, A2, l, alpha, k1, k2, fi, beta, response; while (cin >> r >> h >> d1 >> A1 >> d2 >> A2) { l = sqrt(r*r + h*h); alpha = abs(A1 - A2); if (alpha > 180) alpha -= 360; k1 = alpha / 360; k2 = r / l; fi = 360 * k2; beta = fi * k1; response = sqrt(d1*d1 + d2*d2 - 2 * d1*d2*cos(beta * M_PI / 180)); cout << setprecision(2) << fixed << response << endl; } return 0; } |
Решение задачи
Инициализирую все нужные переменные и через поток ввода считываю все исходные данные. Затем нахожу образующую l по теореме Пифагора и угол между плоскостями — alpha . k1 это часть, которую занимает угол alpha от основания конуса. k2 — коэффициент пропорциональности между окружностями радиусами r и l . fi — величина угла развертки конуса, а beta — угол между прямыми на которых лежат точки, данные в условии. Далее находим искомое расстояние по теореме косинусов.
Все переменные стоит оформлять в LaTeX. Уберите пустые строки в коде.
Done
Хорошо, что получилось. Только не нужно описывать код в этих самых первых программах. Дайте решение с выводом формулы и картинкой развертки конуса.