:: Игры Разума
Расстояние и азимут
Dutch
Автор

Сообщений: 212
Откуда: Волгодонск
Дата регистрации: 25.10.2010
У меня есть справочник Spr_BS, в который занесён список населённых пунктов. Поля справочника такие - Пункт, Расстояние(км), Азимут(градусов). Данные указаны относительно некой постоянной отправной точки "А" - это город в котором расположен офис компании. Из этой точки совершаются поездки в населённые пункты указанные в справочнике Spr_BS.
Ситуация следующая: Я нахожусь в отправной точке А. Мне нужно попасть в точку Б, информация о ней мне известна из справочника Spr_BS.
Задача:
1)Определить, какие населённые пункты встретятся мне по пути. "Попути", пусть это будет коридор в 20 км вправо и влево от вектора следования к пункту Б.
2)Определить, какие населённые пункты встречаются в радиусе 10 км от пункта Б.

Это нужно для того, что бы при поездке в пункт Б можно было увидеть список пунктов находящихся "относительно" по пути. Имея такой список можно будет посетить эти пункты, если есть необходимость. Я понимаю что дорога извивается, да и информации маловато... Но задача носит не критический характер, а служит лишь для упрощения моей жизни. Поэтому приближённые данные вполне устроят.
Ну и пример:
Пункт:г.Ростов-на-Дону
Расстояние: 230
Азимут:260



Исправлено 4 раз(а). Последнее : Dutch, 02.08.12 22:49
Ratings: 0 negative/0 positive
Re: Расстояние и азимут
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Землю считаем круглой, или наплевать (ходим по "плоской" карте, при мелких расстояниях погрешность будет несущественна)? Максимальные расстояния будут порядка сотен км, или нескольких тысяч? Т.к. например попасть в точку-антипод можно по ЛЮБОМУ азимуту, и потому понятие "коридора" будет бессмысленно. Летаем, или таки по дорогам движемся? Т.к. банальнейшая речка с одним единственным мостом на 100 км течения превращает саму идею "движения по кратчайшему" в фикцию.
Вообще для автотранспорта имеет смысл пользоваться навигаторами - т.е. софтом прокладывающим маршрут по дорогам, а не "напрямки топать".
Для начала хотя бы вот это почитай.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Расстояние и азимут
Dutch
Автор

Сообщений: 212
Откуда: Волгодонск
Дата регистрации: 25.10.2010
Максимальное расстояние 300 км. Земля плоская.



Исправлено 1 раз(а). Последнее : Dutch, 03.08.12 00:52
Ratings: 0 negative/0 positive
Re: Расстояние и азимут
Dutch
Автор

Сообщений: 212
Откуда: Волгодонск
Дата регистрации: 25.10.2010
Igor Korolyov
Вообще для автотранспорта имеет смысл пользоваться навигаторами - т.е. софтом прокладывающим маршрут по дорогам, а не "напрямки топать".
Мне не нужно прокладывать маршрут. У меня только две задачи. Ничего другого мне не нужно.
Ratings: 0 negative/0 positive
Re: Расстояние и азимут
Влад Колосов

Сообщений: 22664
Откуда: Ростов-на-Дону
Дата регистрации: 05.05.2005
Азимута недостаточно, необходимо составить таблицу абсолютных координат всех населенных пунктов относительно отправной точки. В таком случае задача сводится к вычислению пересечения множеств точек нас. пунктов и площади фигуры (прямоугольника).


------------------
Совершенство - это не тогда, когда нельзя
ничего прибавить, а тогда, когда нечего убавить.




Исправлено 2 раз(а). Последнее : Влад Колосов, 03.08.12 12:21
Ratings: 0 negative/0 positive
Re: Расстояние и азимут
Mitchman

Сообщений: 9978
Откуда: Николаев
Дата регистрации: 24.05.2002
дык азимут с расстоянием это теже координаты
отсюда все координаты в 20 км коридоре(в обе стороны т.е. общей шириной 40 км) будут

Расстояние*Sin(Abs(Азимут-АзимутНаправления))<=20 And ( Растояние*Cos(Азимут-АзимутНаправлеия)<РасстояниеНаправление And Abs(Азимут-АзимутНаправлеия)<90)

по поводу находящихся в радиусе 10 км от точки

(РасстояниеНаправление-Расстояние*Cos(Азимут-АзимутНаправления))^2+(Расстояние*Sin(Азимут-АзимутНаправления))^2<=100

где
РасстояниеНаправление - радиус основного направления
Расстояние - радиус проверяемого направления
АзимутНаправления - азимут основного направления
Азимут - Азимут проверяемого направления


------------------
-
«свидомые украинцы озабочены не столько созданием украинской культуры, сколько уничтожением русской»
-
Олесь Бузина




Исправлено 4 раз(а). Последнее : Mitchman, 03.08.12 13:31
Ratings: 0 negative/0 positive
Re: Расстояние и азимут
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Влад, помимо азимута есть расстояние - т.е. координаты заданы полно (и они полярные).
Для первой задачи более точным будет не "чистый прямоугольник", а прямоугольник с двумя полукругами по торцам
Прелесть полярных координат в том, что их удобно "крутить" - т.е. простым/дешевым +- угла перевести любой вектор (проведенный из начала координат) к нулевому лучу. Формулу же "попадания в прямоугольник" надобно выводить...


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Расстояние и азимут
Mitchman

Сообщений: 9978
Откуда: Николаев
Дата регистрации: 24.05.2002
Igor Korolyov
Влад, помимо азимута есть расстояние - т.е. координаты заданы полно (и они полярные).
Для первой задачи более точным будет не "чистый прямоугольник", а прямоугольник с двумя полукругами по торцам
Прелесть полярных координат в том, что их удобно "крутить" - т.е. простым/дешевым +- угла перевести любой вектор (проведенный из начала координат) к нулевому лучу. Формулу же "попадания в прямоугольник" надобно выводить...

вроде вывел выше - редактируя

да для более быстрого отсева можно использовать
для 20км коридора
предварительный отсев направлений по Азимут +-90град от Азимута направления(и можно убрать тогда саму проверку в условии)

Abs(Азимут-АзимутНаправления)<=90
или
BETWEEN(Азимут, АзимутНаправления-90, АзимутНаправления+90)


для 10 км радиуса предварительный отсев Азимут +-Arcsin(10/РасстояниеНаправления) от АзимутаНаправления

Abs(Азимут-АзимутНаправления)<=Arcsin(10/РасстояниеНаправления)
или
BETWEEN(Азимут, АзимутНаправления-Arcsin(10/РасстояниеНаправления), АзимутНаправления+Arcsin(10/РасстояниеНаправления))
(формула не имеет смысла при РасстояниеНаправления<10 - в этом случае азимуты могут быть всенаправленны, значит фильтровать нечего)


это если надо ускорить выборку из записей базы


------------------
-
«свидомые украинцы озабочены не столько созданием украинской культуры, сколько уничтожением русской»
-
Олесь Бузина




Исправлено 6 раз(а). Последнее : Mitchman, 03.08.12 14:02
Ratings: 0 negative/0 positive
Re: Расстояние и азимут
Dutch
Автор

Сообщений: 212
Откуда: Волгодонск
Дата регистрации: 25.10.2010
Mitchman
Расстояние*Sin(Abs(Азимут-АзимутНаправления))<=20 And ( Растояние*Cos(Азимут-АзимутНаправлеия)<РасстояниеНаправление And Abs(Азимут-АзимутНаправлеия)<90)
Задал вот такие параметры:
m.РасстояниеНаправления = 235 && General
m.АзимутНаправления = 250 && General
m.Расстояние = 110
m.Азимут = 220
qq1 = Расстояние*Sin(Abs(Азимут-АзимутНаправления))<=20
qq2 = Расстояние*Cos(Азимут-АзимутНаправления)<РасстояниеНаправления
qq3 = Abs(Азимут-АзимутНаправления)<90
Result = qq1 and qq2 and qq3
MESSAGEBOX(Result)

Значение Result = .T., значит эта точка попадает в коридор - всё верно. А теперь увеличиваем значение параметра m.Расстояние. Result будет иметь значение .T. вплоть до m.Расстояние = 1500 - это не верно. Коридор получается черезчур растянутым в длинну. Он должен был оборваться гдето на 235-255 километрах. Только когда m.Расстояние > 1600 коридор заканчивается. Где ошибка?



Исправлено 1 раз(а). Последнее : Dutch, 03.08.12 15:24
Ratings: 0 negative/0 positive
Re: Расстояние и азимут
Рома

Сообщений: 1079
Дата регистрации: 06.06.2001
Dutch
Где ошибка?

Не вдаваясь в формулы - судя по qq3, азимуты у тебя в градусах, но тогда qq1 и qq2 непонятно что вычисляют.
У sin/cos параметр в радианы надо перевести как минимум.
Ratings: 0 negative/0 positive
Re: Расстояние и азимут
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Визуализация сего безобразия.
CLEAR
* grid
_SCREEN.DRAWSTYLE = 2
_SCREEN.FORECOLOR = RGB(0, 0, 0)
_SCREEN.FILLCOLOR = _SCREEN.FORECOLOR
_SCREEN.FILLSTYLE=1
FOR ln1 = 0 TO 7
lnAngle = PI()/8*m.ln1
lnX1 = 200+200*COS(m.lnAngle)
lnY1 = 200-200*SIN(m.lnAngle)
lnX2 = 400 - m.lnX1
lnY2 = 400 - m.lnY1
_SCREEN.LINE(m.lnX1, m.lnY1, m.lnX2, m.lnY2)
ENDFOR
FOR ln1 = 50 TO 200 STEP 50
_SCREEN.CIRCLE(m.ln1,200,200)
ENDFOR
* corridor
_SCREEN.DRAWSTYLE = 0
_SCREEN.FORECOLOR = RGB(0, 255, 0)
_SCREEN.FILLCOLOR = _SCREEN.FORECOLOR
_SCREEN.FILLSTYLE = 7
_SCREEN.BOX(200,180,350,220)
_SCREEN.CIRCLE(20,200,200)
_SCREEN.CIRCLE(20,350,200)
* destination neighbourhood
_SCREEN.FORECOLOR = RGB(128, 128, 0)
_SCREEN.FILLCOLOR = RGB(255, 255, 0)
_SCREEN.FILLSTYLE = 0
_SCREEN.CIRCLE(10,350,200)
* route
_SCREEN.FORECOLOR = RGB(255, 0, 0)
_SCREEN.FILLCOLOR = _SCREEN.FORECOLOR
_SCREEN.FILLSTYLE = 0
_SCREEN.FontSize = 8
_SCREEN.FontName = "Arial"
_SCREEN.CIRCLE(2,200,200)
_SCREEN.CurrentY = 184
_SCREEN.PRINT("A")
_SCREEN.CIRCLE(2,350,200)
_SCREEN.CurrentY = 184
_SCREEN.PRINT("B")
_SCREEN.LINE(200,200,350,200)
* reset _SCREEN
_SCREEN.FILLSTYLE = 1
_SCREEN.FORECOLOR = RGB(0, 0, 0)
_SCREEN.FILLCOLOR = _SCREEN.FORECOLOR
Можно этот код переделать и под рисование приближенное к реальности ("повёрнутых" коридоров).
Просто любое "направление" простым +- "азимута" сводится к изображенному "нулевому" (тут рисуется "математическая" система полярных координат - в геодезии принято нулевой луч рисовать вверх, как "направление на север", да и сам угол в обратную сторону отсчитывается - по часовой стрелке - впрочем, это не имеет ровно никакого значения).
Как видно, в "коридор" по любому входят круги у начальной и конечной точек (по определению "коридора", эти точки находятся на расстоянии до 20км от точки маршрута). Потому "вторую задачу" имеет смысл решать только в случае когда "радиус окрестности" будет БОЛЬШЕ чем "ширина коридора" в первой задаче, иначе эта область будет полностью входить в "коридор".


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Расстояние и азимут
Mitchman

Сообщений: 9978
Откуда: Николаев
Дата регистрации: 24.05.2002
Dutch
Mitchman
Расстояние*Sin(Abs(Азимут-АзимутНаправления))<=20 And ( Растояние*Cos(Азимут-АзимутНаправлеия)<РасстояниеНаправление And Abs(Азимут-АзимутНаправлеия)<90)
Задал вот такие параметры:
m.РасстояниеНаправления = 235 && General
m.АзимутНаправления = 250 && General
m.Расстояние = 110
m.Азимут = 220
qq1 = Расстояние*Sin(Abs(Азимут-АзимутНаправления))<=20
qq2 = Расстояние*Cos(Азимут-АзимутНаправления)<РасстояниеНаправления
qq3 = Abs(Азимут-АзимутНаправления)<90
Result = qq1 and qq2 and qq3
MESSAGEBOX(Result)

Значение Result = .T., значит эта точка попадает в коридор - всё верно. А теперь увеличиваем значение параметра m.Расстояние. Result будет иметь значение .T. вплоть до m.Расстояние = 1500 - это не верно. Коридор получается черезчур растянутым в длинну. Он должен был оборваться гдето на 235-255 километрах. Только когда m.Расстояние > 1600 коридор заканчивается. Где ошибка?

Help COS
COS( ) returns the cosine of nExpression in radians. Use DTOR( ) to convert an angle from degrees to radians. The number of decimal places that COS( ) returns can be specified with SET DECIMALS. The value COS( ) returns ranges between –1 and 1.

m.РасстояниеНаправления = 235 && General
m.АзимутНаправления = 250 && General
m.Расстояние = 40
m.Азимут = 220
m.УголАзимутов=Abs(m.Азимут-m.АзимутНаправления)
If m.УголАзимутов>270
m.УголАзимутов=360-m.УголАзимутов
EndIF
qq1 = Расстояние*Sin(DtoR(m.УголАзимутов))<=20
qq2 = Расстояние*Cos(DtoR(m.УголАзимутов))<РасстояниеНаправления
qq3 = m.УголАзимутов<90
Result = qq3 and qq1 and qq2
MESSAGEBOX(Result)

PS просто нать было в хелпе глянуть что в Фоксе параметры задаются в тригонометрии в радианах,
да тут еще одна загвоздка
при разнице Азимутов нать учитывать переход с 0 на 360, т.е. если основной азимут меньш 90 то для азимутов больше 180ти применить вычитание 360 ти прежде чем подставить в формулу или как я выше выделить разницу азимутов(угол между ними)

ну и для второй части в фоксе теже правила


------------------
-
«свидомые украинцы озабочены не столько созданием украинской культуры, сколько уничтожением русской»
-
Олесь Бузина




Исправлено 4 раз(а). Последнее : Mitchman, 03.08.12 17:22
Ratings: 0 negative/0 positive
Re: Расстояние и азимут
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Приведенная формула косячит при переходе через 0 и использовании диапазона углов от 0 до 2*pi()
Кроме того 90 в последнем сравнении надо заменить на pi()/2 раз уж в SIN/COS передаём радианы, а не градусы.
Например, берём:
РасстояниеНаправления = 200
АзимутНаправления = 0
Расстояние = 100
Азимут = 10*PI()/180

Получаем (как и положено) попадание в прямоугольник.
Меняем:
Азимут = -10*PI()/180
Опять же получаем попадание (что вполне логично, по причине симметрии).
Меняем:
Азимут = 350*PI()/180
Получаем НЕпопадание. Т.к. формула не учитывает "заворачивание" азимута. Тогда как это точно такой же угол что и -10.

И ещё - данная формула (естественно) не учитывает "круги" у стартовой и финишной точек. Это IMHO неправильно в плане решения "общей" задачи - надо дополнительно проверить точку на попадание в эти 2 круга (для круга около стартовой точки, где азимут по сути неопределён, "попадание" определяется просто через "Расстояние <= 20") - вторая формула вроде как правильная, и от "заворачивания углов" не страдает вовсе, т.к. напрямую значения углов не пользует - только тригонометрическим функциям их скармливает, а они это всё понимают как надо. Только надо уточнить, что в ней 100 это требуемый_радиус_круга^2 а то вдруг кто не понял

P.S. Пока писал, уже сам всё и поправил


------------------
WBR, Igor




Исправлено 1 раз(а). Последнее : Igor Korolyov, 03.08.12 17:53
Ratings: 0 negative/0 positive
Re: Расстояние и азимут
Влад Колосов

Сообщений: 22664
Откуда: Ростов-на-Дону
Дата регистрации: 05.05.2005
Если координаты преобразовать в абсолютные, то коридор описывается функциями вида y = a*x, где а определяется азимутом движения, т.е. тангенс угла азимута.

Затем прогоняем все координаты по этой формуле и всё. Плюс-минус на коридор.


------------------
Совершенство - это не тогда, когда нельзя
ничего прибавить, а тогда, когда нечего убавить.
Ratings: 0 negative/0 positive
Re: Расстояние и азимут
Mitchman

Сообщений: 9978
Откуда: Николаев
Дата регистрации: 24.05.2002
Влад Колосов
Если координаты преобразовать в абсолютные, то коридор описывается функциями вида y = a*x, где а определяется азимутом движения, т.е. тангенс угла азимута.
Затем прогоняем все координаты по этой формуле и всё. Плюс-минус на коридор.

не верно

в таком случае отрезок определяющий путь будет опрделяться как Y=a+bX где ab соотвествующие константы
а коридор будет определяться как Y=a(+-)d+bX где +-d горизонтальный сдвиг изначального пути, и равен Sin(наклона отрезка)*на ширину коридора, кроме того надо отсеч начало и конец маршрута - отсюда вычисления в декартовых координатох выходят сложнее полярных


------------------
-
«свидомые украинцы озабочены не столько созданием украинской культуры, сколько уничтожением русской»
-
Олесь Бузина




Исправлено 2 раз(а). Последнее : Mitchman, 03.08.12 18:13
Ratings: 0 negative/0 positive
Re: Расстояние и азимут
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Я бы не сказал что они "выходят сложнее" - и там и там без тригонометрических функций никак. А уж пара их, или все 4 - особой роли не играет. При том, исходя из постановки задачи, конечно же "перевод" является лишним шагом (хотя и "лёгким" для направления полярные->декартовы - обратно несколько сложнее в системе без функции типа atan2). Ну разве что "рисовать" точки на плоскости надо - там без перевода не обойтись...

P.S. Чем-то похожую задачу решали, только там суть была в нахождении "соседей" - тож по "наклонённому прямоугольнику" - но т.к. координаты в базе были заданы декартовые (ну на самом деле не совсем "плоские", а WGS84 - т.е. "географические" - но для требуемых порядков расстояний и типичных положений можно было упростить шарик до плоскости), то первым шагом отсекали "ненаклонный" прямоугольник - т.к. точек много, область большая, а "потеницальных соседей" сравнительно мало - потому 2 прохода вполне оправданы - на первом "оптимизируемый" простой отбор x between x1 and x2 and y between y1 and y2 - а уж внутри по полной прогармме - с косинусами/синусами/квадратами/корнями
Но тут, как я вижу, такой подход позволит в среднем отбросить около 3/4 "пространства точек" - раве что из общего 300км круга очень часто будут выбирать маршруты существенно короче 300км - тогда 2-х ступенчатый отбор мог бы помочь и имело бы смысл дополнительно хранить и декартовы координаты точек. Конечно если точек реально много - для пары сотен даже смысла нет тужиться, и полный перебор сойдёт


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Расстояние и азимут
Dutch
Автор

Сообщений: 212
Откуда: Волгодонск
Дата регистрации: 25.10.2010
Точек на данный момент не более 100. Если проект будет одобрен начальством (что очень маловероятно, но учитывать хотелось бы), их количество может вырости до количества базовых станций компании "ТЕЛЕ2 россия" - несколько тысяч.
Ratings: 0 negative/0 positive
Re: Расстояние и азимут
Mitchman

Сообщений: 9978
Откуда: Николаев
Дата регистрации: 24.05.2002
для этого предваоительный выбор описывал принцип выше


------------------
-
«свидомые украинцы озабочены не столько созданием украинской культуры, сколько уничтожением русской»
-
Олесь Бузина
Ratings: 0 negative/0 positive
Re: Расстояние и азимут
Dutch
Автор

Сообщений: 212
Откуда: Волгодонск
Дата регистрации: 25.10.2010
Mitchman
m.РасстояниеНаправления = 235 && General
m.АзимутНаправления = 250 && General
m.Расстояние = 40
m.Азимут = 220
m.УголАзимутов=Abs(m.Азимут-m.АзимутНаправления)
If m.УголАзимутов>270
m.УголАзимутов=360-m.УголАзимутов
EndIF
qq1 = Расстояние*Sin(DtoR(m.УголАзимутов))<=20
qq2 = Расстояние*Cos(DtoR(m.УголАзимутов))<РасстояниеНаправления
qq3 = m.УголАзимутов<90
Result = qq3 and qq1 and qq2
MESSAGEBOX(Result)

В этом примере, коридор заканчивается при параметре m.Расстояние > 40. А должен примерно при 235 - 255.
Ratings: 0 negative/0 positive
Re: Расстояние и азимут
Mitchman

Сообщений: 9978
Откуда: Николаев
Дата регистрации: 24.05.2002
Dutch
Mitchman
m.РасстояниеНаправления = 235 && General
m.АзимутНаправления = 250 && General
m.Расстояние = 40
m.Азимут = 220
m.УголАзимутов=Abs(m.Азимут-m.АзимутНаправления)
If m.УголАзимутов>270
m.УголАзимутов=360-m.УголАзимутов
EndIF
qq1 = Расстояние*Sin(DtoR(m.УголАзимутов))<=20
qq2 = Расстояние*Cos(DtoR(m.УголАзимутов))<РасстояниеНаправления
qq3 = m.УголАзимутов<90
Result = qq3 and qq1 and qq2
MESSAGEBOX(Result)

В этом примере, коридор заканчивается при параметре m.Расстояние > 40. А должен примерно при 235 - 255.
проверям математически
при Угле меж азимутами 30 градусов уход от оси основногонаправления есть 1/2 от длины расстояния, т.е. максимальное расстояние при котором не уйдем за 20 км от оси будет 40 км

Sin(30)=1/2 - это любой школьник в начале тригонометрии знает

потому то я и поставил 40


------------------
-
«свидомые украинцы озабочены не столько созданием украинской культуры, сколько уничтожением русской»
-
Олесь Бузина




Исправлено 1 раз(а). Последнее : Mitchman, 05.08.12 12:56
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 3 (Гостей: 3)

© 2000-2024 Fox Club 
Яндекс.Метрика