Форум программистов, компьютерный форум, киберфорум
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Slon747
59 / 37 / 1
Регистрация: 24.08.2013
Сообщений: 445
#1

Провести перпендикуляр на карте - Программирование Android

03.12.2015, 10:28. Просмотров 305. Ответов 14
Метки нет (Все метки)

Есть прямая, обозначенная точками A и B.
Есть точка С.
Требуется провести перпендикуляр на прямую AB.
Нашел алгоритм:
Java
1
2
3
4
5
6
7
8
double L=(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
double PR=(x-x1)*(x2-x1)+(y-y1)*(y2-y1);
bool res=true;
double cf=PR/L;
if(cf<0){ cf=0; res=false; }
if(cf>1){ cf=1; res=false; }
double xres=x1+cf*(x2-x1);
double yres=y1+cf*(y2-y1);
Реализовал у себя:
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
LatLng getClosestPoint(LatLng pointA, LatLng pointB, LatLng point) {
 
        double x = point.longitude;
        double y = point.latitude;
 
        double x1 = pointA.longitude;
        double y1 = pointA.latitude;
 
        double x2 = pointB.longitude;
        double y2 = pointB.latitude;
 
        double L = (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);
        double PR = (x - x1) * (x2 - x1) + (y - y1) * (y2 - y1);
        boolean res = true;
        double cf = PR / L;
        if (cf < 0) {
            cf = 0;
            res = false;
        }
        if (cf > 1) {
            cf = 1;
            res = false;
        }
        double xres = x1 + cf * (x2 - x1);
        double yres = y1 + cf * (y2 - y1);
 
        return new LatLng(yres, xres);
    }
В результате действительно находит точку на прямой, но все таки не ближайшую.
После долгих попыток понял, что погрешность сильно зависти от широты. Чем дальше от экватора, тем сильнее искажение. При этом сильное искажение как на больших, так и на малых треугольниках (100 м).
Что посоветуете?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.12.2015, 10:28
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Провести перпендикуляр на карте (Программирование Android):

Нарисовать на карте - Программирование Android
Всем привет. Ребята как нарисовать сверх mapView трек или свои фигуры у меня не получается. Нашел класс но выдает ошибку ...

Не определяется путь к SD карте - Программирование Android
Перепробовал все методы, указанные на этом форуме. Был на всех ветках, посвященных работой с картой памяти. (например, Путь к карте памяти...

Путь к карте памяти - Программирование Android
Добрый день! У меня лежит файл в памяти телефона. В приложении прописываю путь к файлу вот таким образом: File sdcard =...

Создание кликабельного объекта на карте - Программирование Android
Приветствую всех! Использую либу mapsforge (offline карты osm), возникла необходимость добавлять на карту объекты(собственные POI), с...

Проверка на достижение локации на карте - Программирование Android
Хотелось бы динамически получать координаты и выводить их в виде тоста. @Override protected void onCreate(Bundle...

Отобразить местоположение на карте по координатам - Программирование Android
Взял из книжки такой код для отображения местоположения на карте по заданным координатам (например, взял координаты Москвы): ...

14
Valakin
431 / 97 / 15
Регистрация: 21.02.2015
Сообщений: 731
03.12.2015, 10:44 #2
искать ответ в учебнике по геометрии, наша планета не плоская как известно
0
Slon747
59 / 37 / 1
Регистрация: 24.08.2013
Сообщений: 445
03.12.2015, 10:51  [ТС] #3
Цитата Сообщение от Valakin Посмотреть сообщение
наша планета не плоская как известно
Черт побери. Я не знал! Но т.к. даже на мизерных треугольниках большое искажение, то дело в сферической системе координат.
0
Valakin
431 / 97 / 15
Регистрация: 21.02.2015
Сообщений: 731
03.12.2015, 11:07 #4
спокойно, я тоже ищу зависимость между координатами на сфере (правда в пространстве) и на развертке этой сферы.
задавал вопрос на других форумах, никто не хочет делится

я бы по долготе и широте нашел координаты x, y, z двух точек
а найти между ними расстояние раз плюнуть
1
Slon747
59 / 37 / 1
Регистрация: 24.08.2013
Сообщений: 445
03.12.2015, 11:20  [ТС] #5
Цитата Сообщение от Valakin Посмотреть сообщение
я бы по долготе и широте нашел координаты x, y, z двух точек
а найти между ними расстояние раз плюнуть
Не понял. Перевести в декартову систему координат?
Кстати, расстояние между точками на сфере мне известно. Так что можно пойти другим путем при поиске перпендикуляра. Т.к. расстояния очень малые, сферичностью можно пренебречь.
0
Valakin
431 / 97 / 15
Регистрация: 21.02.2015
Сообщений: 731
03.12.2015, 11:37 #6
Цитата Сообщение от Slon747 Посмотреть сообщение
дело в сферической системе координат
Цитата Сообщение от Slon747 Посмотреть сообщение
Т.к. расстояния очень малые, сферичностью можно пренебречь
не противоречь себе, дело именно в сферичности, идет искажение по оси х, если учтешь это то получишь правильный результат
по-идее у тебя и расстояния между двумя точками при таком подходе будут с погрешностью которая увеличивается от экватора

задача решаемая, только надо тригонометрию сюда задействовать
0
Slon747
59 / 37 / 1
Регистрация: 24.08.2013
Сообщений: 445
03.12.2015, 12:02  [ТС] #7
Цитата Сообщение от Valakin Посмотреть сообщение
не противоречь себе, дело именно в сферичности, идет искажение по оси х, если учтешь это то получишь правильный результат
по-идее у тебя и расстояния между двумя точками при таком подходе будут с погрешностью которая увеличивается от экватора
Экспериментальным путем выяснил, что влияет именно Y.
И видно это хоть на 100 км, хот на 100 м. А какая сферичность на 100 метрах?
Также выяснил, что если задать точки отрезка А и В строго вертикально с севера на юг, то перпендикуляр идеальный, а если наклонить, то перпендикуляр не верный.
0
Valakin
431 / 97 / 15
Регистрация: 21.02.2015
Сообщений: 731
03.12.2015, 12:23 #8
я по превычке x для широты (latitude) использую, а в приведенном коде все наоборот, тогда да, по y,
если возьмешь координаты Москвы и Казани как x1 y1 x2 y2 и посчитаешь по простой формуле расстояние между ними, то оно окажется намного больше чем в действительности
0
Slon747
59 / 37 / 1
Регистрация: 24.08.2013
Сообщений: 445
03.12.2015, 12:58  [ТС] #9
Цитата Сообщение от Valakin Посмотреть сообщение
я по превычке x для широты (latitude) использую, а в приведенном коде все наоборот, тогда да, по y,
Да, я сам напутал X и Y.
0
bastrakov
91 / 91 / 14
Регистрация: 10.10.2015
Сообщений: 307
Записей в блоге: 1
03.12.2015, 17:43 #10
топикстартеру: попробуйте ввести коэффициент, который зависит именно от широты.
2Valakin: или я чего не понял, или расстояние между гео-координатами легко гуглится. я что-то быстро нагуглил на стековерфло, и до сих пор считало правильно. :-)
0
Slon747
59 / 37 / 1
Регистрация: 24.08.2013
Сообщений: 445
03.12.2015, 18:31  [ТС] #11
Решил преобразовать координаты из полярной системы в декартовую, найти точку на прямой, а потом вернуть в полярную систему.
Нашел формулу преобразования, но получаю не верные координаты в декартовой системе:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void polarToCartesian() {
 
//координаты в полярной системе
double lat = 47;
double lon = 37;
 
//переводим в радианы
double lat_radian = Math.toRadians(lat);
double lon_radian = Math.toRadians(lon);
 
final double r = 6371.; // Радиус Земли
 
//получаем декартовы координаты 
double x = r * cos(lat_radian) * cos(lon_radian);
double y = r * cos(lat_radian) * sin(lon_radian);
double z = r * sin(lat_radian);
}
0
Valakin
431 / 97 / 15
Регистрация: 21.02.2015
Сообщений: 731
04.12.2015, 08:11 #12
Цитата Сообщение от Slon747 Посмотреть сообщение
преобразовать координаты из полярной системы в декартовую
круто, а как определил что не правильно?

кстати понадобится по любому такая же только наоборот для преобразования из декартовой в полярную

Добавлено через 9 минут
дальше возможно надо так
1. найти уравнение прямой по двум точкам
2. найти уравнение перпендикуляра к этой прямой проходящую через третью точку
3. найти точку пересечения этих двух прямых
4. найти уравнение прямой проходящую через точку из п.3 и центр сферы
5. найти точку пересечения сферы и прямой
6. преобразовать точку из декарта в углы

получилось длинно,
есть другие варианты

например
4. найти расстояние от точки п.3 до цента сферы
5. преобразовать точку п.3 из декарта в углы используя радиус из п.4
0
Slon747
59 / 37 / 1
Регистрация: 24.08.2013
Сообщений: 445
04.12.2015, 09:15  [ТС] #13
Цитата Сообщение от Valakin Посмотреть сообщение
круто, а как определил что не правильно?
Вот тут получаю заведомо верный результат преобразования: http://keisan.casio.com/exec/system/1223527679
LatLng(47,37) возвращает в декартовых:
x=37.5359
y=28.2853

Тот-же результат выдает и на другом web-ресурсе.
У меня же по формуле получается:
x=3437.3313957
y=2642.7014421

Цитата Сообщение от Valakin Посмотреть сообщение
кстати понадобится по любому такая же только наоборот для преобразования из декартовой в полярную
Это понятно. Но я не до конца понимаю, что потом делать со значением Z?
Разве что для обратного преобразования понадобится?

Цитата Сообщение от Valakin Посмотреть сообщение
дальше возможно надо так
1. найти уравнение прямой по двум точкам
2. найти уравнение перпендикуляра к этой прямой проходящую через третью точку
3. найти точку пересечения этих двух прямых
4. найти уравнение прямой проходящую через точку из п.3 и центр сферы
5. найти точку пересечения сферы и прямой
6. преобразовать точку из декарта в углы
[/quote]
А зачем это? В первом сообщении я уже получаю перпендикуляр.
0
Valakin
431 / 97 / 15
Регистрация: 21.02.2015
Сообщений: 731
04.12.2015, 10:27 #14
Цитата Сообщение от Slon747 Посмотреть сообщение
Вот тут получаю заведомо верный результат преобразования: http://keisan.casio.com/exec/system/1223527679
LatLng(47,37) возвращает в декартовых:
x=37.5359
y=28.2853
по моему ты радиус Земли указываешь 47 метров

Добавлено через 47 секунд
Цитата Сообщение от Slon747 Посмотреть сообщение
У меня же по формуле получается:
x=3437.3313957
y=2642.7014421
Это по коду из первого поста?

Добавлено через 6 минут
если да, и он считает правильно тему можно закрыть
0
Slon747
59 / 37 / 1
Регистрация: 24.08.2013
Сообщений: 445
04.12.2015, 10:50  [ТС] #15
Цитата Сообщение от Valakin Посмотреть сообщение
по моему ты радиус Земли указываешь 47 метров
Ой, похоже на то.
Но тогда не понятно, что значит угол "θ". Мне же нужно получить x и y. А значит, вводить нужно как Lat, так и Lng. А там при вводе радиуса и одного угла возвращает сразу x и y.

Итак, ввожу радиус земли 6371 (можно в м, результат будет отличаться также на 3 порядка) и координату 47, получаю:
4,345.011552
4,659.45443

Всё же не то, что у меня.
0
04.12.2015, 10:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.12.2015, 10:50
Привет! Вот еще темы с ответами:

Две точки GPS на карте - Программирование Android
Добрый вечер. Программирую только под микроконтроллеры, сейчас появляется необходимость написания приложений под Android. Меня интересует...

Нарисовать маршрут на карте гугл - Программирование Android
Получаю координаты https://maps.googleapis.com/maps/api/directions/json?origin=Toronto&amp;destination=Montreal Когда рисую то получается...

Получение своего местоположения на карте - Программирование Android
Здравствуйте. Есть небольшая проблема с получением своего местоположения на карте. Никак не могу понять, как это сделать. Что пробовал: ...

База данных на карте памяти - Программирование Android
У меня приложение создаёт базу данных, но она создаётся в памяти телефона. Скажите как сделать чтобы она сохранялась на карте памяти?


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.