Форум программистов, компьютерный форум CyberForum.ru

Найти минимальную длину пути - C++

Восстановить пароль Регистрация
 
njkz596
Сообщений: n/a
24.06.2012, 20:15     Найти минимальную длину пути #1
На поверхности планеты, являющейся шаром с радиусом R, заданы две точки со своими широтой и долготой. Найти минимальную длину пути по поверхности этой планеты из одной точки в другую.
Ограничения:широта-в градусах -90 до 90, долгота в градусах от -180 до 180, 100<R<10000, все числа вещественные.
На С++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alexey31415
 Аватар для alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
24.06.2012, 20:36     Найти минимальную длину пути #2
Вы бы хотя бы формулы дали по которым считать надо
njkz596
Сообщений: n/a
24.06.2012, 20:41     Найти минимальную длину пути #3
я сам формулы не знаю потому и написал
igor_kz
150 / 150 / 12
Регистрация: 16.06.2012
Сообщений: 312
24.06.2012, 20:57     Найти минимальную длину пути #4
Пускай Ws, Hs - широта и долгота начальной точки
Пускай Wf, Hf - широта и долгота конечной точки
R - радиус шара.
Угол между этими двумя точками вычисляется так: T = arccos(sin(Ws)sin(Wf) + cos(Ws)cos(Wf)cos(L)), где L - разница между долготами.
Само расстояние теперь равно D = R * T;
grizlik78
Эксперт С++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,960
24.06.2012, 21:29     Найти минимальную длину пути #5
С формулой, что выше, будет попроще немного, я через векторы сделал. Надеюсь результат совпадает
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <iostream>
#include <numeric>
#include <cmath>
 
class vect3d
{
    double c[3];
public:
    vect3d() : c() {}
    vect3d(double x, double y, double z) { c[0] = x; c[1] = y; c[2] = z; }
    double operator*(vect3d const& v) const
    {
        return std::inner_product(c, c+3, v.c, 0.0);
    }
    void print(std::ostream & os) const
    {
        os << "("<<c[0] << ", " << c[1] << ", " <<c[2] << ")";
    }
};
 
std::ostream& operator<< (std::ostream& os, vect3d const& v)
{
    v.print(os);
    return os;
}
 
double abs(vect3d const& v)
{
    return sqrt(v*v);
}
 
vect3d polar3d(double r, double phi, double theta)
{
    return vect3d(
            r*cos(phi)*cos(theta),
            r*sin(phi)*cos(theta),
            r*sin(theta)
            );
}
 
double input_double(std::string name, double min, double max)
{
    double d;
    if (min >= max)
        return min;
    do {
        std::cout << "Input " << name 
            << " (" << min << ".." << max << "): " << std::endl;
    } while ((std::cin >> d) && (d < min || d > max));
    if (std::cin.fail())
        std::cout << "Input error" << std::endl;
    return d;
}
 
int main()
{
    double radius = input_double("radius", 100, 10000);
    double lon1 = input_double("longitude1", -180, 180);
    double lat1 = input_double("latitude1", -90, 90);
    double lon2 = input_double("longitude2", -180, 180);
    double lat2 = input_double("latitude2", -90, 90);
    vect3d v1 = polar3d(1.0, lon1/180.0*M_PI, lat1/180.0*M_PI);
    vect3d v2 = polar3d(1.0, lon2/180.0*M_PI, lat2/180.0*M_PI);
 
    std::cout << "Minimal distance: " <<
        radius*acos( v1*v2/(abs(v1)*abs(v2))) <<std::endl;
    return 0;
}
scarlett1806
0 / 0 / 0
Регистрация: 04.12.2014
Сообщений: 21
08.01.2015, 17:59     Найти минимальную длину пути #6
Та же задача только на паскале посмотрите почему ответ не правильный?
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
program Shpere;
 
var t:text; r,phi1,phi2,psi1,psi2,x,L:real;
 
begin
Assign(t,'INPUT.TXT');
Reset(t);
Read(t,r);
Readln(t,phi1,psi1);
Readln(t,phi2,psi2);
Close(t);
{phi1:=(phi1*180)/pi;
phi2:=(phi2*180)/pi;
psi1:=(psi1*180)/pi;
psi2:=(psi2*180)/pi;}
x:=sin(phi1)*sin(phi2)+cos(phi1)*cos(phi2)*cos(psi1-psi2);
L:=2*arctan(sqrt(1-sqr(x))/x);
L:=pi*L/2.0;
 
Assign(t,'OUTPUT.TXT');
Rewrite(t);
Writeln(t,L:1:2);
Close(t);
end.
Yandex
Объявления
08.01.2015, 17:59     Найти минимальную длину пути
Ответ Создать тему
Опции темы

Текущее время: 02:28. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru