Matlab: рассчитать видимый угол горизонта для точек на карте высот

У меня есть карта высот гористой местности (большой массив 2d со значениями z)

Я хочу знать высоту видимого угла горизонта для всех пеленгов компаса для определенных точек на моей карте высот.

Для иллюстрации на этом веб-сайте есть несколько примеров того, что мне нужно.

Редактировать: я перестал пытаться найти функцию, которая делает это, и теперь пишу свою собственную.

Мой подход заключается в том, чтобы рисовать линии радиально от моей точки, интерполируя высоту вдоль этих линий, а затем беря max(z/r) вдоль каждой линии.

Если вы знаете функцию, которая уже делает это, сообщите мне, если нет, надеюсь, я смогу загрузить ее в ближайшее время.


person Swier    schedule 17.04.2015    source источник
comment
Почему matlab? Вы уже написали matlab код для решения своей проблемы? Не могли бы вы показать нам, что вы сделали до сих пор?   -  person gboffi    schedule 17.04.2015
comment
До сих пор я просмотрел множество документации, ничего не нашел, и я надеялся, что кто-то здесь знает правильный инструмент. На данный момент я работаю над этим: mathworks.com/matlabcentral/fileexchange/49065 -shadem, а затем перебирая все возможные углы (360*90), чтобы узнать, когда мои точки затенены, а когда нет. Но должен быть лучший способ сделать это. Почему Matlab: это часть большой физической модели, написанной на Matlab, и мне нужно включить затенение ландшафта для расчета потока энергии через поверхность.   -  person Swier    schedule 17.04.2015
comment
@Swier: Кажется, вы действительно не думали о математическом фоне. Я предлагаю вам сначала попытаться решить ее для 0°. Сначала вычислите, под каким углом появляется каждый пиксель на линии (тригонометрическая функция), затем возьмите максимум.   -  person Daniel    schedule 17.04.2015


Ответы (1)


Допустим, у вас есть 3 матрицы, X Y и Z и ваша позиция (x,y,z), вы можете вычислить

R = sqrt((X-x)**2 + (Y-y)**2) (спасибо, Дэниел...)

R = sqrt((X-x).^2 + (Y-y).^2)
Z = (Z-z)

т. е. расстояния от положения и относительные высоты, так что

T = Z/R

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

Для заданного направления вы можете найти список ближайших точек на сетке с помощью варианта алгоритма Брезенхэма и, наконец, найдите наибольшее значение T в вашем списке баллов.

В конце концов, из списка максимальных значений T (касательных) для разных направлений вы можете вычислить углы обзора из вашего положения.

person gboffi    schedule 17.04.2015
comment
этот подход, вероятно, приведет к очень быстрому коду. В Matlab это .^, а не ** - person Daniel; 17.04.2015