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

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.82
Mupok
 Аватар для Mupok
4 / 4 / 0
Регистрация: 24.07.2012
Сообщений: 74
#1

Интересная задача с географическими координатами и идеальным поездом передвигающимся от силы гравитации - C++

01.12.2012, 06:49. Просмотров 2070. Ответов 11
Метки нет (Все метки)

Всем доброго времени суток.

С дублировал тему так как на форуме явы народа почти нет. Да и по больше части меня интересуют формулы и алгоритм.

У меня имеется интересная задачи в которой не могу полностью разобраться.
Даны вот такие значения:
open

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
   public final static double      
       G = 6.6742E-11,     // [m^3 sec^-2 kg^-1] gravity constant             
       R = 6.378E6,        // [m]        planet Earth radius 
       M = 5.974E24,       // [kg]       planet Earth mass 
       g = G*M/(R*R),     // [m sec^-2] gravity acceleration on surface  
       V = PI*4/3*R*R*R,  // [m^3]      sphere volume 
       w = M/V;           // [kg m^-3]  density
     
   public final static String[] locus = {
       "90°  0' 0     \"N    14°  23' 20.49 \"E ",    //0  North pole
       "20°           \"E    90°  0'        \"S ",    //1  South pole
       "50°  6' 19.45 \"N    14°  23' 20.49 \"E ",    //2  Menza CVUT - vchod
       "50°  6'  8.90 \"N    14°  23' 33.84 \"E ",    //3  FEL Dejvice - vchod                   
       "50°  4' 45.134\"N    14°  25' 50.071\"E ",    //4  Nar. Muzeum, Praha
       "50°  4' 45.134\"S   165°  34' 39.929\"W ",    //5  Nar. Muzeum protinoha                  
       "51° 30' 45.49 \"N     0°  07' 17.15 \"W ",    //6  Brit. Museum, London
       "37° 52' 17.40 \"N   122°  15' 56.77 \"W ",    //7  Univ. Berkeley Calif.
       "36° 51' 00.84 \"S   174°  46' 09.21 \"E ",    //8  Univ. Auckland,  NZ
       "31° 14' 12.44 \"N   121°  30' 09.77 \"E ",    //9  The Opener, ShangHai
       "37° 47' 41.78 \"N   122°  24' 08.85 \"W ",    //10 The Needle, SF/Calif. 
       "22° 24' 08.85 \"W    57°  47' 41.78 \"N ",    //11 Point A
       "47° 47' 41.78 \"N    22°  24' 08.85 \"W ",    //12 Point B

То есть, даны постоянные известные значения, как радиус планеты, вес, гравитация, плотность и т.п.
Также даны примеры координат мест на планете.
Задача состоит в том, что между двумя любыми точками(которые задаются по формату как написано выше) нужно найти дистанцию прямую, по земле, и максимальную глубину туннеля - это первая фаза.
Вторая фаза:
Идеальный поезд нулевой длины в начале туннеля имеет нулевую скорость. Ускоряется он только при помощи земной гравитации. Надо рассчитать время за которое он проедет весь туннель, его максимальную и среднюю скорости.
Использовать нужно единицы измерения системы си(радианы, метры, секунды, килограммы).

Впопыхах я начал писать программу на яве. Начал с малого, т.е. считывание со стринговского поля конкретную числовую информацию. Дальше я собирался все это дело переводить из географических координат в сферическую систему, а после все это загнать в декартову систему. Но потом задумался, а не лишняя работа ли это будет, и правильно ли это будет, имеет ли смысл. Просто я так сгоряча сорвался все это осуществлять и совсем забыл что у меня с векторами очень туго, и ничего подходящего для этой темы не могу найти.

Я представляю себе план таковым:
1. Считываю все данные.
2. Откладываю 2 вектора от начала координат в 2 заданных точки.
3. По какой-нибудь формуле рассчитываю длину разности этих векторов.
4. Теория расчета глубины: каким-то образом находим точку середины туннеля, потом узнаем длину вектора от этой точки до начала координат, и отнимаем это от радиуса планеты.
5. А вот далее с движением поезда я даже представления не имею, что делать. С физикой "труба" =(

Люди добрые, помогите пожалуйста с осуществлением данной задачи. Скоро сдавать симестралку, последняя надежда на вас.

Вот написана крохотная
часть

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
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
69
70
71
72
73
74
75
76
77
78
79
80
package sim_package;
 
public class sim_class {
    public final static String[] locus = {  // priklady lokalizace ruznych mist.
       "90°  0' 0     \"N    14°  23' 20.49 \"E ",    //0  North pole
       "20°           \"E    90°  0'        \"S ",    //1  South pole
       "c             \"N    14°  23' 20.49 \"E ",    //2  Menza CVUT - vchod
       "50°  6'  8.90 \"N    14°  23' 33.84 \"E ",    //3  FEL Dejvice - vchod                   
       "50°  4' 45.134\"N    14°  25' 50.071\"E ",    //4  Nar. Muzeum, Praha
       "50°  4' 45.134\"S   165°  34' 39.929\"W ",    //5  Nar. Muzeum protinoha                  
       "51° 30' 45.49 \"N     0°  07' 17.15 \"W ",    //6  Brit. Museum, London
       "37° 52' 17.40 \"N   122°  15' 56.77 \"W ",    //7  Univ. Berkeley Calif.
       "36° 51' 00.84 \"S   174°  46' 09.21 \"E ",    //8  Univ. Auckland,  NZ
       "31° 14' 12.44 \"N   121°  30' 09.77 \"E ",    //9  The Opener, ShangHai
       "37° 47' 41.78 \"N   122°  24' 08.85 \"W ",    //10 The Needle, SF/Calif. 
       "22° 24' 08.85 \"W    57°  47' 41.78 \"N ",    //11 Point A
       "47° 47' 41.78 \"N    22°  24' 08.85 \"W ",    //12 Point B
    };
    public static void main(String[] args) {
        double[] sirka_delka = rad(locus[0]);
        System.out.println(sirka_delka[0]+"  "+sirka_delka[1]);
    }
    public static  double[] rad(String point){
        double[] rad_metoda = new double[2];
        int count = 0;
        int count01 = 0;
        for (int z = 0; z < 2; z++) {
            String pamet = "";
            boolean check = false;
            for (int i = count; i < point.length(); i++) {
                count += 1;
                if(point.charAt(i) == (char)176){break;}
                if((point.charAt(i) >= 48) && (point.charAt(i) <= 57)) {
                    pamet += point.charAt(i);
                }
            }
            rad_metoda[z] = Double.valueOf(pamet);
            pamet = "";
            for (int i = count; i < point.length(); i++) {
                count++;
                if(point.charAt(i) == 39){break;}
                if(point.charAt(i) == 34){
                    check = true;
                    break;
                }            
            }
            if(!check){
                count01 = count-2;
                while((point.charAt(count01) >= 48) && (point.charAt(count01) <= 57)){
                    pamet += point.charAt(count01);
                    count01 = count01 - 1;                
                }
                rad_metoda[z] += (Double.valueOf(pamet)/60);
                pamet = "";
                for (int i = count; i < point.length(); i++) {
                    count++;
                    if(point.charAt(i) == 34){
                        check = true;
                        break;
                    }
 
                    if ((point.charAt(i) >= 46) && (point.charAt(i) <= 57)) {
                        pamet += point.charAt(i);
                    }
                }
                rad_metoda[z] += (Double.valueOf(pamet)/3600);
            }
            if(check){
                switch(point.charAt(count)){
                    case 'N': rad_metoda[0] = 90 - rad_metoda[0];   break;
                    case 's': rad_metoda[0] = 90 + rad_metoda[0];   break;
                    case 'W': rad_metoda[1] = 360 - rad_metoda[1];  break;
                    case 'E': break;
                }
            }
            count++;
        }
        return rad_metoda;
    }
}


Подскажите пожалуйста, кто чем может. Как лучше реализовать все это, может формулы для вычисления какие-нибудь, а если кто то захочет написать какую-нибудь часть программы буду премного благодарен, но главная цель алгоритм и формулы.

Если вы знаете хоть чуточку больше того, что здесь я написал: отзовитесь пожалуйста.

Если кто-нибудь хочет связаться лично[личные данные удалены]

P.s. если вы с Праги за помощь угощу пивом =)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.12.2012, 06:49     Интересная задача с географическими координатами и идеальным поездом передвигающимся от силы гравитации
Посмотрите здесь:

Треугольник задан координатами вершин х 1 у1 х 2 у 2 х 3 у 3 точка а задана координатами х у требуется написать программу определяющую попадает ли указанная точка в заданный треугольник C++ Builder
Интересная производственная задача. Нужны идеи. C++ Builder
Интересная сортировка C++
C++ Интересная задача. (вывод своего кода на экран)
Судоку. Задача довольно-таки интересная C++
C++ Интересная задача на предельные значения переменных
Нужна программа расчета полета мяча с учетом гравитации C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nick Alte
Эксперт С++
1599 / 991 / 117
Регистрация: 27.09.2009
Сообщений: 1,910
Завершенные тесты: 1
01.12.2012, 09:16     Интересная задача с географическими координатами и идеальным поездом передвигающимся от силы гравитации #2
Цитата Сообщение от Mupok Посмотреть сообщение
1. Считываю все данные.
Надеюсь, с этим сложностей не будет.
Цитата Сообщение от Mupok Посмотреть сообщение
2. Откладываю 2 вектора от начала координат в 2 заданных точки.
Это просто, синусы-косинусы долготы и широты. Простейший поиск по словам "сферические координаты" даст исчерпывающую информацию.
Цитата Сообщение от Mupok Посмотреть сообщение
3. По какой-нибудь формуле рассчитываю длину разности этих векторов.
Ещё проще. Находим сам вектор разности (он нам потом пригодится), покомпонентно вычитая координаты второй точки из координат первой, считаем его длину старым добрым Пифагором.
Цитата Сообщение от Mupok Посмотреть сообщение
4. Теория расчета глубины: каким-то образом находим точку середины туннеля, потом узнаем длину вектора от этой точки до начала координат, и отнимаем это от радиуса планеты.
Точку середины находим просто: добавляем к координатам первой точки уполовиненный вектор разности. Глубина - радиус планеты минус длина этого вектора.
Цитата Сообщение от Mupok Посмотреть сообщение
5. А вот далее с движением поезда я даже представления не имею, что делать.
Если тоннель неглубокий, то можно решить через потенциальную-кинетическую энергию, но вообще может понадобиться учитывать изменение гравитационной постоянной по мере углубления в Землю и интегрировать, аналитически или численно. Здесь нам поможет то, что пересчитывать притяжение Земли внутри неё достаточно просто - надо исходить из того, что весь слой Земли выше нашей глубины как будто срезали, и остался только шарик ниже нас. К этой части лучше приступить уже после реализации первых 4 пунктов.
Mupok
 Аватар для Mupok
4 / 4 / 0
Регистрация: 24.07.2012
Сообщений: 74
01.12.2012, 09:46  [ТС]     Интересная задача с географическими координатами и идеальным поездом передвигающимся от силы гравитации #3
Это просто, синусы-косинусы долготы и широты. Простейший поиск по словам "сферические координаты" даст исчерпывающую информацию.
То есть это те формулы которые нужны для перевода в декартову систему как я понял
Вот формулы с википедии, я планировал по ним.

Ещё проще. Находим сам вектор разности (он нам потом пригодится), покомпонентно вычитая координаты второй точки из координат первой, считаем его длину старым добрым Пифагором.
Квадрат длины вектора равен сумме квадратов его координат, так?

Точку середины находим просто: добавляем к координатам первой точки уполовиненный вектор разности. Глубина - радиус планеты минус длина этого вектора.
Получается надо прибавлять к той точки от которой в начале отнимаешь, находя вектор разницы?

Если тоннель неглубокий, то можно решить через потенциальную-кинетическую энергию, но вообще может понадобиться учитывать изменение гравитационной постоянной по мере углубления в Землю и интегрировать, аналитически или численно. Здесь нам поможет то, что пересчитывать притяжение Земли внутри неё достаточно просто - надо исходить из того, что весь слой Земли выше нашей глубины как будто срезали, и остался только шарик ниже нас. К этой части лучше приступить уже после реализации первых 4 пунктов.
Java
1
2
3
4
5
6
       G = 6.6742E-11,     // [m^3 sec^-2 kg^-1] gravity constant             
       R = 6.378E6,        // [m]        planet Earth radius 
       M = 5.974E24,       // [kg]       planet Earth mass 
       g = G*M/(R*R),     // [m sec^-2] gravity acceleration on surface  
       V = PI*4/3*R*R*R,  // [m^3]      sphere volume 
       w = M/V;           // [kg m^-3]  density
Известны лишь эти данные. Но мне не понятно, для чего дается объем. Точнее плотность. Масса для гравитации, объем и масса для плотности, но вот только зачем?
Nick Alte
Эксперт С++
1599 / 991 / 117
Регистрация: 27.09.2009
Сообщений: 1,910
Завершенные тесты: 1
01.12.2012, 12:51     Интересная задача с географическими координатами и идеальным поездом передвигающимся от силы гравитации #4
Через плотность можно пересчитывать изменение ускорения свободного падения. Которое падает при уходе на глубину.
На предыдущие вопросы ответ "да". Формулы те, квадрат длины равен, получается.
Mupok
 Аватар для Mupok
4 / 4 / 0
Регистрация: 24.07.2012
Сообщений: 74
01.12.2012, 18:24  [ТС]     Интересная задача с географическими координатами и идеальным поездом передвигающимся от силы гравитации #5
Цитата Сообщение от Nick Alte Посмотреть сообщение
Через плотность можно пересчитывать изменение ускорения свободного падения. Которое падает при уходе на глубину.
А могли бы вы подсказать эти формулы если они вам известны, или ссылкой поделиться на данную информацию.

Большое спасибо за помощь

Добавлено через 18 минут
И еще один вопрос:
Правильно ли я делаю то, что перевожу координаты из геог. в сфер.? Просто в географических координатах 2 угла откладываются по/от горизонтальной плоскости, а в сферической системе координат откладывается один из них от аппликаты(зет).
Код думаю будет ясен. Рад_метода это полученный градус. В операторе выбора буквы обозначены также как в координатах(север/юг/запад/восток)
Java
1
2
3
4
5
6
                switch(point.charAt(count)){
                    case 'N': rad_metoda[0] = 90 - rad_metoda[0];   break;
                    case 's': rad_metoda[0] = 90 + rad_metoda[0];   break;
                    case 'W': rad_metoda[1] = 360 - rad_metoda[1];  break;
                    case 'E': break;
                }
Добавлено через 9 минут
И забыл о самом главном, как рассчитать путь между точками по земле?
Nick Alte
Эксперт С++
1599 / 991 / 117
Регистрация: 27.09.2009
Сообщений: 1,910
Завершенные тесты: 1
01.12.2012, 20:46     Интересная задача с географическими координатами и идеальным поездом передвигающимся от силы гравитации #6
В географических координатах долгота откладывается от вертикальной плоскости, а широта от горизонтальной. Так что с формулами порядок.

Что до движения - то не хочу лишать удовольствия самому пригвоздить пером к бумаге эту закономерность. Подскажу общую идею. Общая энергия поезда всегда неизменна, она состоит из двух частей - потенциальной и кинетической. Кинетическая связана с квадратом скорости, потенциальная прямо связана с высотой (это если мы считаем g постоянным). Таким образом, мы можем в любой точке вывести скорость из глубины. Если откладываем расстояния в тоннеле по оси X (это, естественно, уже не та же X, что в пересчёте сферических координат), то время путешествия от точки A в точку B будет таким:
http://www.cyberforum.ru/cgi-bin/latex.cgi?\int_{A}^{B}\frac{1}{v(x)}{dx}.
Скорость вычисляется по глубине, глубина вычисляется из x, что само по себе тоже отдельная занятная задачка. Если мы учитываем изменение силы тяжести при углублении, можно воспользоваться знанием плотности: на глубине d Земля притягивает к своему центру точно с той же силой, что и материальная точка, расположенная в центре и имеющая массу шара с радиусом R - d, где R - радиус Земли. Эту массу несложно рассчитать, исходя из неё - силу притяжения и ускорение свободного падения и их зависимость от глубины. Из этой зависимости можно получить и уточнённую формулу для зависимости потенциальной энергии от глубины.
Mupok
 Аватар для Mupok
4 / 4 / 0
Регистрация: 24.07.2012
Сообщений: 74
02.12.2012, 01:49  [ТС]     Интересная задача с географическими координатами и идеальным поездом передвигающимся от силы гравитации #7
В географических координатах долгота откладывается от вертикальной плоскости, а широта от горизонтальной. Так что с формулами порядок.
Вот это система сферических координат.
Здесь - географические координаты.
Картинки взяты с википедии. Думаю они объяснят вам то, о чем я вам говорю.

По поводу остального - я постараюсь как-нибудь это усвоить, но пока что я ничего не понял
И так же путь по земле остается под вопросом

Спасибо большое за помощь
Nick Alte
Эксперт С++
1599 / 991 / 117
Регистрация: 27.09.2009
Сообщений: 1,910
Завершенные тесты: 1
02.12.2012, 10:22     Интересная задача с географическими координатами и идеальным поездом передвигающимся от силы гравитации #8
Цитата Сообщение от Mupok Посмотреть сообщение
Вот это система сферических координат. Здесь - географические координаты.
Так на этих картинках одно и то же изображено. Как я и говорил - долгота отсчитывается от вертикальной плоскости, широта от горизонтальной. Так что спасибо, конечно, колоссальное, за объяснение, но...

Путь по земле - тоже штука простая. Нормализуем радиус-векторы (то есть, координаты) конечных точек: поделим каждую координату на длину вектора. Вычислим скалярное произведение этих нормализованных векторов (сумма произведений одноимённых координат). Это будет косинус угла между векторами, из которого легко определим сам угол, выразив в радианах. Умножим его на радиус Земли, получим путь по Земле.
Mupok
 Аватар для Mupok
4 / 4 / 0
Регистрация: 24.07.2012
Сообщений: 74
02.12.2012, 19:18  [ТС]     Интересная задача с географическими координатами и идеальным поездом передвигающимся от силы гравитации #9
Цитата Сообщение от Nick Alte Посмотреть сообщение
Так на этих картинках одно и то же изображено. Как я и говорил - долгота отсчитывается от вертикальной плоскости, широта от горизонтальной. Так что спасибо, конечно, колоссальное, за объяснение, но...
Значит я просто вас не так понял, пардон
Путь по земле - тоже штука простая. Нормализуем радиус-векторы (то есть, координаты) конечных точек: поделим каждую координату на длину вектора. Вычислим скалярное произведение этих нормализованных векторов (сумма произведений одноимённых координат). Это будет косинус угла между векторами, из которого легко определим сам угол, выразив в радианах. Умножим его на радиус Земли, получим путь по Земле.
Я вычислил так:
Взял гео координаты.
cos(d)=sin(a_latitude)*sin(b_latitude) + cos(a_latitude)*cos(b_latitude)*cos(a_longitude - b_longitude)
S = d * R
Я так и не понял толком, что же такое Д, но проверял на калькуляторах рассчитывающих расстояния по координатам -вроде сходится. Сходится с точностью до километра, а вот в метрах уже расход идет.
Калькулятор юзал здесь.
Их расчеты ==== 20037.508342789242 км
Мой результат = 20037.077944595702 км
Nick Alte
Эксперт С++
1599 / 991 / 117
Регистрация: 27.09.2009
Сообщений: 1,910
Завершенные тесты: 1
02.12.2012, 19:37     Интересная задача с географическими координатами и идеальным поездом передвигающимся от силы гравитации #10
d - угол между линиями, проведёнными из центра Земли к конечным точкам маршрута.
Mupok
 Аватар для Mupok
4 / 4 / 0
Регистрация: 24.07.2012
Сообщений: 74
02.12.2012, 19:38  [ТС]     Интересная задача с географическими координатами и идеальным поездом передвигающимся от силы гравитации #11
То что уже готово:
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
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
package tunel_package;
import static java.lang.Math.*;
public class tunel {
   public final static double      // ve vypoctech uzivejte tyto hodnoty !
       G = 6.6742E-11,     // [m^3 sec^-2 kg^-1] gravity constant             
       R = 6.378E6,        // [m]        planet Earth radius 
       M = 5.974E24,       // [kg]       planet Earth mass 
       g = G*M/(R*R),     // [m sec^-2] gravity acceleration on surface  
       V = PI*4/3*R*R*R,  // [m^3]      sphere volume 
       w = M/V;           // [kg m^-3]  density
     
   public final static String[] locus = {  // priklady lokalizace ruznych mist.
       "90°  0' 0     \"N    14°  23' 20.49 \"E ",      //0  North pole
       "90°  0'       \"S    20°            \"E ",      //1  South pole
       "50°  6' 19.45 \"N    14°  23' 20.49 \"E ",      //2  Menza CVUT - vchod
       "50°  6'  8.90 \"N    14°  23' 33.84 \"E ",      //3  FEL Dejvice - vchod                   
       "50°  4' 45.134\"N    14°  25' 50.071\"E ",      //4  Nar. Muzeum, Praha
       "50°  4' 45.134\"S   165°  34' 39.929\"W ",      //5  Nar. Muzeum protinoha                  
       "51° 30' 45.49 \"N     0°  07' 17.15 \"W ",      //6  Brit. Museum, London
       "37° 52' 17.40 \"N   122°  15' 56.77 \"W ",      //7  Univ. Berkeley Calif.
       "36° 51' 00.84 \"S   174°  46' 09.21 \"E ",      //8  Univ. Auckland,  NZ
       "31° 14' 12.44 \"N   121°  30' 09.77 \"E ",      //9  The Opener, ShangHai
       "37° 47' 41.78 \"N   122°  24' 08.85 \"W ",      //10 The Needle, SF/Calif. 
       "22° 24' 08.85 \"W    57°  47' 41.78 \"N ",      //11 Point A
       "47° 47' 41.78 \"N    22°  24' 08.85 \"W ",      //12 Point B
       "55° 45'     0 \"N    37°  37'     0 \"E ",      //13 Point c
       "59° 53'     0 \"N    30°  15'     0 \"E ",      //14 Point d
    };
     
    public static void main(String[] args) {
        boolean[] strana = new boolean[4];
        for (int i = 0; i < strana.length; i++) {
            strana[i]=false;
        }
        byte a = 0;                                      //odkud (pole Locus)
        byte b = 1;                                      //kam   (pole Locus)
        double[] vek_a = vektor(a,strana);
        double[] vek_b = vektor(b,strana);
        System.out.println("tunnel length [m]     = "+tunel_length_depth(vek_a,vek_b)[0]);     // 1. FAZE
        System.out.println("surface distance [m]  = "+srface_distance(a, b, strana));
        System.out.println("maximal depth [m]     = "+tunel_length_depth(vek_a,vek_b)[1]);
        System.out.println("travel time [sec]     = ");     // 2. FAZE
        System.out.println("maximal speed [m/sec] = ");
        System.out.println("average speed [m/sec] = ");
    }
    public static double srface_distance(byte a, byte b, boolean[]strana){
        double surface = 0;
        double d;
        double as = rad(locus[a], strana)[0];
        double ad = rad(locus[a], strana)[1];
        for (int i = 0; i < strana.length; i++) {
            if(strana[i] == true){
                switch(i){
                    case 0:             break;
                    case 1: as *= -1;   break;
                    case 2: ad *= -1;   break;
                    case 3:             break;
                }
            }
        }
        for (int i = 0; i < strana.length; i++) {
            strana[i]=false;
        }
        double bs = rad(locus[b],strana)[0];
        double bd = rad(locus[b],strana)[1];
        for (int i = 0; i < strana.length; i++) {
            if(strana[i] == true){
                switch(i){
                    case 0:             break;
                    case 1: bs *= -1;   break;
                    case 2: bd *= -1;   break;
                    case 3:             break;
                }
            }
        }
        
        d = Math.acos(Math.sin(as)*Math.sin(bs)+Math.cos(as)*Math.cos(bs)*Math.cos(ad-bd));
        surface = d*R;
        return surface;
    }
    public static double[] rad(String point, boolean[] strana){          //cte jednu radku, pak chova informace
        for (int i = 0; i < strana.length; i++) {
            strana[i]=false;
        }
        double[] rad_metoda = new double[2];
        int count = 0;                                  // scitac
        for (int z = 0; z < 2; z++) {
            String pamet = "";
            boolean check = false;                      //true kdyz precte sirku
            for (int i = count; i < point.length(); i++) {
                count++;
                if(point.charAt(i) == (char)176)break;  //jestli °
                if((point.charAt(i) >= 48) && (point.charAt(i) <= 57)) {    //jestli vic nez 0 a mene nez 9
                    pamet += point.charAt(i);
                }
            }
            rad_metoda[z] = Double.valueOf(pamet);      // prevod ze stringu do double
            pamet = "";
            for (int i = count; i < point.length(); i++) {
                count++;
                if(point.charAt(i) == 39){break;}       // jestli '
                if(point.charAt(i) == 34){              // jestli "
                    check = true; break;
                }
                if((point.charAt(count) >= 46) && (point.charAt(count) <= 57)){
                pamet += point.charAt(count);                
                }
            }
            if(!check){
                if(pamet.length() != 0){
                    rad_metoda[z] += (Double.valueOf(pamet)/60);
                }
                pamet = "";
                for (int i = count; i < point.length(); i++) {
                    count++;
                    if(point.charAt(i) == 34){
                        check = true; break;
                    }
                    if((point.charAt(i) >= 46) && (point.charAt(i) <= 57)){
                        pamet += point.charAt(i);
                    }
                }
                if(pamet.length() != 0){
                    rad_metoda[z] += (Double.valueOf(pamet)/3600);
                }
            }
            rad_metoda[z] = (rad_metoda[z]*Math.PI)/180;
            if(check){
                switch(point.charAt(count)){
                    case 'N': strana[0] = true;  break;
                    case 'S': strana[1] = true;  break;
                    case 'W': strana[2] = true;  break;
                    case 'E': strana[3] = true;  break;
                }
            }
        }
        return rad_metoda;
    }
    public static double[] vektor(byte place, boolean[] strana){
        double[] vek = new double[3];
        double[] temp = new double[2];
        for (int i = 0; i < 2; i++) {
            temp[i] = rad(locus[place],strana)[i];
        }
        for (int i = 0; i < 10; i++) {
            switch(i){
                case 0: temp[0] = Math.PI/2 - temp[0];   break;
                case 1: temp[0] = Math.PI/2 + temp[0];   break;
                case 2: temp[1] = Math.PI*2 - temp[1];  break;
                case 3: break;
            }    
        }
        vek[0] = R * Math.sin(temp[0]) * Math.cos(temp[1]);
        vek[1] = R * Math.sin(temp[0]) * Math.sin(temp[1]);
        vek[2] = R * Math.cos(temp[0]);
        return vek;
    }
    public static double[] tunel_length_depth(double[]vek_a,double[]vek_b){
        double[] tunnel = new double[2];
        double[] soucet = new double[3];
        soucet[0] = vek_a[0] - vek_b[0];
        soucet[1] = vek_a[1] - vek_b[1];
        soucet[2] = vek_a[2] - vek_b[2];
        tunnel[0] = Math.sqrt(soucet[0]*soucet[0]+soucet[1]*soucet[1]+soucet[2]*soucet[2]);
        soucet[0] = vek_b[0] + soucet[0]/2;
        soucet[1] = vek_b[1] + soucet[1]/2;
        soucet[2] = vek_b[2] + soucet[2]/2;
        tunnel[1] = R - Math.sqrt(soucet[0]*soucet[0]+soucet[1]*soucet[1]+soucet[2]*soucet[2]);
        return tunnel;
    }
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.12.2012, 20:19     Интересная задача с географическими координатами и идеальным поездом передвигающимся от силы гравитации
Еще ссылки по теме:

C++ Очень интересная задача, не все смогут
C++ Интересная задача на вывод процентов
C++ Задача с координатами
Интересная задача на графы C++
Может ли пешка выполнить ход из клетки с координатами (X1, Y1) в клетку с координатами (X2, Y2)? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Mupok
 Аватар для Mupok
4 / 4 / 0
Регистрация: 24.07.2012
Сообщений: 74
02.12.2012, 20:19  [ТС]     Интересная задача с географическими координатами и идеальным поездом передвигающимся от силы гравитации #12
Для наглядности
Название: obrazec.png
Просмотров: 109

Размер: 15.2 Кб
Yandex
Объявления
02.12.2012, 20:19     Интересная задача с географическими координатами и идеальным поездом передвигающимся от силы гравитации
Ответ Создать тему
Опции темы

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