0
Апр 14
Зачастую при геомоделировании (и в других областях думаю тоже) приходится применять карту азимутов для задания направления какого-либо процесса.
При построении стандартными средствами интерполяции (любой алгоритм) имеется довольно значимый баг при переходе азимута через ноль. Т.е. имеем две соседние точки наблюдения, в которых задано северное направление, но в одной 10 градусов, а в другой - 350. Интерполируя карту от 10 до 350 значения азимута на расстоянии между этими точками пробегают весь круг: восток, юг, запад. Нужно же чтоб интерполяция была от 10 до 0(360) и от 360(0) до 350.
Каким образом можно обойти сию проблему? С помощью каких преобразований или инструмента.
Опубликовано
03 Апр 2014
Активность
7
ответов
4894
просмотра
3
участника
1
Рейтинг
Контекст
карты x11
Имеется в виду построение карты по точкам?
да, по точкам
У тебя же наверняка не весь диапазон азимутов, допустим, от 290 до 50, прибавь 90 градусов и от того, что больше 360, вычти 360 приведи его к от 20 до 140 отмасштабируй, построй поверхность, потом отними назад 90 градусов и к отрицательным значениям прибавь 360 )
Пусть есть точки со значениями угла A, тогда для каждой точки рассчитываем еще x=cosA, y=sinA - это некоторые координаты точек на единичной окружности. Строим две карты x и y, в результате интерполяции получаем, что исходные точки соединены кратчайшими отрезками внутри единичного круга (избавились от разрывности). Теперь осталось для каждой точки на этом отрезке найти промежуточный угол, т.е. вычисляем карты A1=arccos(x/(x^2+y^2)^0.5) и A2=arcsin(x/(x^2+y^2)^0.5). По разнице между A1 и A2 находим четверть, в которой находится угол, т.е. примерно так: Если A2>0 то A=A1, иначе A=360-A1.
В общем, чтобы объяснить нормально, нужно рисовать. Но должно сработать.
TimTTT, так уже делал, не самое изящное решение, сегодня задача, где не весь диапазон, завтра - весь.
Wasteland Rat, под вечер точно не соображу, завтра с утра попробую нарисовать)
Однако, замечу, что в общем виде аналитически это не решение, т.к. возможно деление на ноль. В общем виде по-моему решения нет. На всякий случай следует вставить проверку на нулевой знаменатель (т.е. x=0 и y=0) и вставлять тупо любой угол. Поясню что это значит. Например у нас всего две точки в одной азимут 0 градусов в другой 180 - и пофигу каким путем идти через 90 градусов или через 270, это неформализуемо.
Потестил в петреле, работает. Но карта, понятное дело, получается вся в разрывах через 0, зачем она такая нужна не совсем понятно :)
Калькулятор атрибутов для набора точек Angle:
Xa=Cos(Z)
Ya=Sin(Z)
Затем по этим двум атрибутам строятся две карты Xa (Angle) и Ya (Angle)
Затем в калькуляторе поверхностей:
A1=If(Xa_Angle=0 And Ya_Angle=0,0,Acos(Xa_Angle/Sqrt(Xa_Angle*Xa_Angle+Ya_Angle*Ya_Angle)))
A2=If(Xa_Angle=0 And Ya_Angle=0,0,Asin(Ya_Angle/Sqrt(Xa_Angle*Xa_Angle+Ya_Angle*Ya_Angle)))
A=If(A2>0,A1,360-A1)