Форум программистов, компьютерный форум, киберфорум
Геометрия
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/21: Рейтинг темы: голосов - 21, средняя оценка - 4.71
 Аватар для snake32
3502 / 1685 / 236
Регистрация: 26.02.2009
Сообщений: 8,398
Записей в блоге: 6

Разложение угла по сферическим координатам

16.05.2011, 18:01. Показов 4503. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени!

В сферических координатах задана точка, необходимо найти координаты другой точки(в тех же сферических координатах) зная расстояние(по дуге) и направление(азимут) движение.
Радиус сферы известен. Это наша планета Земля.
Азимут - угол на сфере относительно СЕВЕРА.

Вопрос: Можно ли разложить угол между двумя точками(концы дуги пройденного пути) по широте и долготе через синус и косинус?

Delphi
1
2
3
4
5
6
7
8
9
// долгота,широта,азимут в градусах
procedure optcoord( const lon,lat,d,a:double; var lonres,latres:double );
  var alpha,az:double;
begin
  alpha := (d/rzem)*toDeg; // угол между концами дуги(в градусах)
  az := a*toRad;// переводим азимут в радианы
  lonres := lon + alpha*sin(az); // вот так можно делать?
  latres := lat + alpha*cos(az); // или нет? Почему?
end;
Добавлено через 31 минуту
Нет, нельзя так. Потому что в зависимости от широты расстояние не должно менятся. а у меня оно меняется. Ближе к полюсам 1000 км превращаются в метры. К тому же горизонтальное движение получается у меня только по одной широте, что в корне не верно, должно проходить по максимальной окружности на шаре. Формула на много сложнее чем я предпологал...
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.05.2011, 18:01
Ответы с готовыми решениями:

Перейти к цилиндрическим и сферическим координатам
Перейти к цилиндрическим координатам: \int \int \int dxdydz, {x}^{2}+{y}^{2}+{z}^{2}\leq 1, {x}^{2}+{y}^{2}\leq {z}^{2}, z\geq 0 ...

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

Вычислить декартовы координаты точки по сферическим координатам
Задание: Вычислить декартовы координаты точки M(x, y, z), если ее сферические координаты: r = 3,345, φ = 125o10' и θ = 20o20'....

17
Хочу в Исландию
 Аватар для skaa
1041 / 840 / 119
Регистрация: 10.11.2010
Сообщений: 1,630
16.05.2011, 18:11
Посмотрите тут:
http://www.vemix.com/Tutorials... %20code%29
, пример на JavaScript.
2
 Аватар для snake32
3502 / 1685 / 236
Регистрация: 26.02.2009
Сообщений: 8,398
Записей в блоге: 6
16.05.2011, 18:35  [ТС]
Тут длина дуги между двумя точками на сфере... пресекается с моей задачей конечно, но не то что мне нужно...

Добавлено через 5 минут
skaa, можете рассказать про чудо формулу:
JavaScript
1
qarckm=2*Rad*Math.asin(qchordkm/2/Rad);
Всё остальное вроде понял:
Идёт преобразовани в декартову систему, потом находят прямое растояние между точками(qchordkm)
А вот что за арксинус? Из какой формулы не понял

Добавлено через 13 минут
во. нашёл
Хорда b= R*2* Sin (альфа/2).
альфа - центральный угол, осталось узнать что такое центральный угол.
0
Хочу в Исландию
 Аватар для skaa
1041 / 840 / 119
Регистрация: 10.11.2010
Сообщений: 1,630
16.05.2011, 19:08
Центральный угол - это угол с вергшиной в центре окружности и концами на окружности. Т.е. формула которую Вы прислали Хорда b= R*2* Sin (альфа/2) и qarckm=2*Rad*Math.asin(qchordkm/2/Rad); - одно и то же.
2
 Аватар для snake32
3502 / 1685 / 236
Регистрация: 26.02.2009
Сообщений: 8,398
Записей в блоге: 6
16.05.2011, 19:21  [ТС]
С этим вроде всё понятно, спасибо.

Вот думаю теперь над своей задачей.
Есть вариант преобразовать в декартову систему 3Д начальную точку. Затем сгенерировать матрицу поворота по углу(az) и вектору вращения, который можно получить путём векторного произведения вектора радиуса в начальную точку и вектора азимута(пока не понял как его вычислить). Далее собственно переносим точку по сфере путём умноежения матрицы на начальную точку. И преобразование обратно в сферическую.
Но как-то через одно место все эти преобразования. Тем более я не знаю как вычислить вектор азимута. Уверен, должен быть метод проще...
0
Хочу в Исландию
 Аватар для skaa
1041 / 840 / 119
Регистрация: 10.11.2010
Сообщений: 1,630
17.05.2011, 01:05
Да, вектор азимута - самое сложное звено в Вашей задаче. Что-то ничего пока в голову не пришло...
0
Хочу в Исландию
 Аватар для skaa
1041 / 840 / 119
Регистрация: 10.11.2010
Сообщений: 1,630
17.05.2011, 03:56
Вот что я тут нарисовал... Вроде всё сходится, но как это всё проверить? Сегодня времени нет, завтра если получится, напишу программу.
Миниатюры
Разложение угла по сферическим координатам   Разложение угла по сферическим координатам   Разложение угла по сферическим координатам  

Разложение угла по сферическим координатам  
2
 Аватар для snake32
3502 / 1685 / 236
Регистрация: 26.02.2009
Сообщений: 8,398
Записей в блоге: 6
17.05.2011, 13:28  [ТС]
вот ещё, думаю, пригодится
http://gis-lab.info/qa/great-circles.html
1
 Аватар для A3B5
1227 / 957 / 77
Регистрация: 20.03.2011
Сообщений: 848
18.05.2011, 01:12
Цитата Сообщение от snake32 Посмотреть сообщение
...Можно ли разложить угол между двумя точками(концы дуги пройденного пути) по широте и долготе через синус и косинус? ...
Насколько я понимаю, вам может пригодиться формула
https://www.cyberforum.ru/cgi-bin/latex.cgi?\cos \gamma  = \cos {\theta _1} \cdot \cos {\theta _2} + \sin {\theta _1} \cdot \sin {\theta _2}\cos ({\alpha _1} - {\alpha _2})
https://www.cyberforum.ru/cgi-bin/latex.cgi?\gamma - центральный угол между точками на поверхности сферы,
https://www.cyberforum.ru/cgi-bin/latex.cgi?{\theta _1},{\theta _2} - полярные углы этих точек (зенитное расстояние; угол, дополнительный к широте),
https://www.cyberforum.ru/cgi-bin/latex.cgi?{\alpha _1},{\alpha _2} - так называемые азимутальные углы (долгота).

ЗЫ snake32 уже дал ссылку на эту формулу, я не заметил
2
 Аватар для snake32
3502 / 1685 / 236
Регистрация: 26.02.2009
Сообщений: 8,398
Записей в блоге: 6
18.05.2011, 02:57  [ТС]
A3B5, опять же - это расстояние между известными точками. А мне надо решить почти обратную задачу: по расстоянию и направлению определить конечную точку.

Гугл молчит как рыба об лёд как-будто формул больше вообще нет
0
Хочу в Исландию
 Аватар для skaa
1041 / 840 / 119
Регистрация: 10.11.2010
Сообщений: 1,630
20.05.2011, 20:40
Вот попробуйте. От Москвы до Петербурга и от Москвы до Харькова посчиталось правильно. Если пришлёте ошибки для каких-нибдь других городов, буду благодарен!
HTML5
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
<html>
    <head>
        <title>CalculatePoint</title>
        <script>
        var RadEth=6356.9;
        function fnCalculatePoint(osrc,dis,azh)
        {
            var lon,lat;
            var xb_ttt,yb_ttt,zb_ttt,xb_tt,yb_tt,zb_tt,xb_t,yb_t,zb_t,xb,yb,zb;
            var theta;
            var otgt;
 
            lon=osrc.lon/180*Math.PI;
            lat=osrc.lat/180*Math.PI;
            azh=azh/180*Math.PI;
 
            xb_ttt=-RadEth*Math.sin(dis/RadEth);
            yb_ttt=0;
            zb_ttt=RadEth*Math.cos(dis/RadEth);
 
            xb_tt=xb_ttt*Math.cos(azh)+yb_ttt*Math.sin(azh);
            yb_tt=-xb_ttt*Math.sin(azh)+yb_ttt*Math.cos(azh);
            zb_tt=zb_ttt;
 
            theta=Math.PI/2-lat;
            xb_t=zb_tt*Math.sin(theta)+xb_tt*Math.cos(theta);
            yb_t=yb_tt;
            zb_t=zb_tt*Math.cos(theta)-xb_tt*Math.sin(theta);
 
            xb=xb_t*Math.cos(lon)-yb_t*Math.sin(lon);
            yb=xb_t*Math.sin(lon)+yb_t*Math.cos(lon);
            zb=zb_t;
 
            otgt=new Object();
            otgt.lon=Math.atan(yb/xb);
            otgt.lat=Math.PI/2-Math.acos(zb/RadEth);
 
            return otgt;
        }
        function fnCalculate()
        {
            var osrc,dis,azh;
            var ores=document.getElementById('idRes');
 
            osrc=new Object();
            osrc.lon=document.getElementById('idLongitude').value;
            osrc.lat=document.getElementById('idLatitude').value;
            dis=document.getElementById('idDistance').value;
            azh=document.getElementById('idAzimuth').value;
            otgt=fnCalculatePoint(osrc,dis,azh);
 
            ores.innerHTML='[res*'+Math.round(otgt.lon/Math.PI*180)+':'+Math.round(otgt.lat/Math.PI*180)+']<br/>\r\n';
        }
        </script>
    </head>
    <body>
        <table cellpadding="0" cellspacing="0">
            <tr><td>Longitude, °:</td><td><input type='text' id='idLongitude' size='10'/></td></tr>
            <tr><td>Latitude, °:</td><td><input type='text' id='idLatitude' size='10'/></td></tr>
            <tr><td>Distance, km:</td><td><input type='text' id='idDistance' size='10'/></td></tr>
            <tr><td>Azimuth, °:</td><td><input type='text' id='idAzimuth' size='10'/></td></tr>
            <tr><td></td><td><input type='button' value='Calculate' onClick='fnCalculate();'/></td></tr>
            <tr><td></td><td><div id='idRes'></div></td></tr>
        </table>
    </body>
</html>
Добавлено через 6 минут
Результат выдаёт в таком виде: долгота:широта.
1
 Аватар для snake32
3502 / 1685 / 236
Регистрация: 26.02.2009
Сообщений: 8,398
Записей в блоге: 6
23.05.2011, 11:35  [ТС]
skaa, Хорошая работа!!!
Я до такого не додумался
Радует что на форуме есть действительно умные люди.

Я провёл небольшие тестирования вашей ф-ии и обнаружил ошибки:
Долгота вроде от широты, азимута и длины не зависит, в том смысле что ошибка стабильно себя ведёт при любых зачениях (широты, азимута и длины). Поэтому следующий тест проводился на широте 0, азимут 0 и длина 1000.
На всём диапазоне долготы зависимость следующая( исходный диапазон долготы => результирующий диапазон долготы )
Assembler
1
2
3
[-270..-90) => [ -90..90 ) - ошибка
[-90 .. 90] => [-90 .. 90 ] - верно
(90..270] => (-90 .. 90 ] - ошибка
Вечером постараюсь понять Вашу формулу и попытаюсь доработать, оптимизировать

Добавлено через 16 минут
Да, ещё обнаружил: если путь проходит через полюс, то там тоже что-то некорректно, но я ещё не уверен...
0
Хочу в Исландию
 Аватар для skaa
1041 / 840 / 119
Регистрация: 10.11.2010
Сообщений: 1,630
23.05.2011, 17:50
Жду результатов, если будет возможность указать на мои ошибки, то пожалуйста, буду очень рад!
Я только что проверил если из долгота 0, широта 0, расстояние 39942, то с любым азимутом попадаем в 0, 0. По крайней мере, это работает.

Добавлено через 2 минуты
Попробовал из других точек - тоже возвращаюсь откуда вышел, кроме разве что если долгота скажем 101°, то программа считает -79°, что есть одно и то же.
0
 Аватар для snake32
3502 / 1685 / 236
Регистрация: 26.02.2009
Сообщений: 8,398
Записей в блоге: 6
23.05.2011, 18:03  [ТС]
Цитата Сообщение от skaa Посмотреть сообщение
кроме разве что если долгота скажем 101°, то программа считает -79°, что есть одно и то же.
Ничё не понимаю
долгота изменяется в горизонтальной пл-ти и обычно [-180..180), ну, или [0..360). Как 101 может быть равен -79? Ведь период = 360! Тогда уж 360-79 = 281, то есть -79 = 281, а 101 в свою очередь = -259
0
Хочу в Исландию
 Аватар для skaa
1041 / 840 / 119
Регистрация: 10.11.2010
Сообщений: 1,630
23.05.2011, 18:16
Извините, был неправ... это я считать не умею.
0
23.05.2011, 18:18  [ТС]

Не по теме:

Ну если честно я сам на калькуляторе посчитал 360-79

0
Хочу в Исландию
 Аватар для skaa
1041 / 840 / 119
Регистрация: 10.11.2010
Сообщений: 1,630
24.05.2011, 17:14
Попробовал разные значения, вроде как для любой долготы -90°<lon<90° возвращается в ту же точку если пройти всю длину окружности, а для обратной стороны Земли и её краёв -90° и 90° я в коде посмотрю что неправильно.
Если найдёте ещё ошибки, буду рад...

Добавлено через 2 часа 48 минут
Всё правильно кроме перевода из декартовой в сферическую (предпоследний абзац в функции fnCalculatePoint):
JavaScript
1
2
3
            otgt=new Object();
            otgt.lon=Math.atan(yb/xb);
            otgt.lat=Math.PI/2-Math.acos(zb/RadEth);
, я прочитал не до конца, а там ещё написано что формула только для первого квадранта. Завтра постараюсь исправить если время будет...

Добавлено через 15 часов 35 минут
Новый вариант с исправленным переводом в сферическую систему:
HTML5
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
<html>
    <head>
        <title>Calculate Point by Azimuth and Distance</title>
        <script>
        var RadEth=6356.9;
        function fnCalculatePoint(osrc,dis,azh)
        {
            var lon,lat;
            var xb_ttt,yb_ttt,zb_ttt,xb_tt,yb_tt,zb_tt,xb_t,yb_t,zb_t,xb,yb,zb;
            var theta;
            var otgt;
 
            lon=osrc.lon/180*Math.PI;
            lat=osrc.lat/180*Math.PI;
            azh=azh/180*Math.PI;
 
            xb_ttt=-RadEth*Math.sin(dis/RadEth);
            yb_ttt=0;
            zb_ttt=RadEth*Math.cos(dis/RadEth);
 
            xb_tt=xb_ttt*Math.cos(azh)+yb_ttt*Math.sin(azh);
            yb_tt=-xb_ttt*Math.sin(azh)+yb_ttt*Math.cos(azh);
            zb_tt=zb_ttt;
 
            theta=Math.PI/2-lat;
            xb_t=zb_tt*Math.sin(theta)+xb_tt*Math.cos(theta);
            yb_t=yb_tt;
            zb_t=zb_tt*Math.cos(theta)-xb_tt*Math.sin(theta);
 
            xb=xb_t*Math.cos(lon)-yb_t*Math.sin(lon);
            yb=xb_t*Math.sin(lon)+yb_t*Math.cos(lon);
            zb=zb_t;
 
            otgt=new Object();
            otgt.lon=Math.atan(yb/xb);
            if(xb<0)
            {
                if(yb>=0)
                    otgt.lon+=Math.PI;
                else
                    otgt.lon-=Math.PI;
            }
            otgt.lat=Math.PI/2-Math.acos(zb/RadEth);
 
            otgt.lon=otgt.lon/Math.PI*180;
            otgt.lat=otgt.lat/Math.PI*180;
 
            return otgt;
        }
        function fnCalculate()
        {
            var osrc,dis,azh;
            var ores=document.getElementById('idRes');
 
            ores.innerHTML='';
 
            osrc=new Object();
            osrc.lon=document.getElementById('idLongitude').value;
            osrc.lat=document.getElementById('idLatitude').value;
            dis=document.getElementById('idDistance').value;
            azh=document.getElementById('idAzimuth').value;
            otgt=fnCalculatePoint(osrc,dis,azh);
 
            ores.innerHTML+='[res*'+Math.round(otgt.lon*100)/100+':'+Math.round(otgt.lat*100)/100+']<br/>\r\n';
        }
        </script>
    </head>
    <body>
        <table cellpadding="0" cellspacing="0">
            <tr><td>Longitude, °:</td><td><input type='text' id='idLongitude' size='10'/></td></tr>
            <tr><td>Latitude, °:</td><td><input type='text' id='idLatitude' size='10'/></td></tr>
            <tr><td>Distance, km:</td><td><input type='text' id='idDistance' size='10'/></td></tr>
            <tr><td>Azimuth, °:</td><td><input type='text' id='idAzimuth' size='10'/></td></tr>
            <tr><td></td><td><input type='button' value='Calculate' onClick='fnCalculate();'/></td></tr>
            <tr><td></td><td><div id='idRes'></div></td></tr>
        </table>
    </body>
</html>
2
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
25.05.2011, 05:08
Цитата Сообщение от snake32
В сферических координатах задана точка, необходимо найти координаты другой точки(в тех же сферических координатах) зная расстояние(по дуге) и направление(азимут) движение.
wiki. сферические координаты
wiki. расстояние между точками на сфере

зная расстояние(по дуге)
длина дуги

направление(азимут) движение
направление движения это phi2 ?

если это phi2, то неизвестно только theta2
получается (по формуле дуги)
число = arccos(число * cos(theta2) + число * sin(theta2))
cos(число) = число * cos(theta2) + число * sin(theta2)
число = число * cos(theta2) + число * sin(theta2)
число * cos(theta2) + число * sin(theta2) - число = 0

wiki. тангенс половинного угла
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.05.2011, 05:08
Помогаю со студенческими работами здесь

Вычисление декартовых координат точки M(x, y, z) по заданным сферическим координатам
Вычислить декартовы координаты точки M(x, y, z), если ее сферические координаты: r = 3,345, φ = 125o10' и θ = 20o20'....

По координатам вершин треугольника найти уравнение высоты, медианы, величину угла
1 и 2 есть. Сделать чертёж 7. записать систему линейных неравенств определяющих треугольник АВС. 6. длину высоты опущенной из...

Нарисовать прямоугольный треугольник по заданным координатам вершин острых углов и величине угла
Помогите! Нужно нарисовать любой прямоугольный треугольник за заданными координатами вершин острых углов и градусной мерой одного из углов.

Подключение силового ключа для управления сферическим двигателем
Всем привет, Мне нужно сделать управление двигателем с MCS-51, я все никак не могу разобраться как подключать силовой ключ(L6203)....

Рассчитать квадрат синуса угла, значение угла вводится с клавиатуры в градусах
Помогите. Нужно написать программу на СИ(в Visual Studio) которая расчитывает синус угла в квадрате , значение угла вводится с клавиатуры в...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru