Рисование топографической карты

34
задан 12 revs, 5 users 58% 17 August 2017 в 13:30
поделиться

7 ответов

градиент является математическим оператором, который может помочь Вам.

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

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

я предложил бы

  1. значения высоты выбора, в которых Вы проведете линии
  2. , создают набор точек на прекрасной, расположенной с равными интервалами сетке, затем обходят каждую точку на маленьких шагах в направлении градиента к самой близкой высоте, на которой Вы хотите чертить линию
  3. , создают кривые путем продвижения каждого перпендикуляра точки в градиент; устраните избыточные точки путем уничтожения точки, когда другая кривая прибывает слишком близкая к ней - но постараться не уничтожать центр песочных часов как числа, Вы, возможно, должны были бы проверить угол между ориентированным векторным перпендикуляром к градиенту для обеих из точек. (Когда я говорю ориентированный, я имею в виду, удостоверяются, что угол между градиентом и перпендикулярным значением, которое Вы вычисляете, всегда - 90 градусов в том же направлении.)
9
ответ дан ellisbben 27 November 2019 в 17:16
поделиться

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

кривые topo, которые Вы хотите потянуть, изоповерхности из скалярного поля более чем 2 размера. Для изоповерхностей в 3 размерах, существует идущие кубы алгоритм.

3
ответ дан ellisbben 27 November 2019 в 17:16
поделиться

В ответ на Ваш комментарий к @erickson и ответить на точку о вычислении градиента Вашей функции. Вместо того, чтобы вычислить производные Ваших 300 функций термина Вы могли сделать числовое дифференцирование следующим образом.

, Учитывая точку [x, y] в Вашем изображении Вы могли вычислить градиент (направление достойных самых крутых)

g={  ( f(x+dx,y)-f(x-dx,y) )/(2*dx), 
  {  ( f(x,y+dy)-f(x,y-dy) )/(2*dy) 

, где дуплекс и dy могли быть интервалом в Вашей сетке. Линия контура выполнит перпендикуляр к градиенту. Так, для получения направления контура, c, мы можем умножить g = [v, w] матрицей, = [0 - 1, 1 0] предоставление

c = [-w,v]
3
ответ дан Azim 27 November 2019 в 17:16
поделиться

Я хотел что-то вроде этого сам, но не нашел основанное на векторе решение.

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

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

, Возможно, некоторые примеры помогут. Предположим, что текущий пиксель при "повышении" 12 футов, сосед при повышении 8 футов, и линии контура составляют каждые 10 футов. Затем существует линия контура половина пути между; нарисуйте текущий пиксель цветом линии контура в 50%-й непрозрачности. Другой пиксель на уровне 11 футов и имеет соседа на уровне 6 футов. Окрасьте текущий пиксель в 80%-й непрозрачности.

alpha = (contour - neighbor) / (current - neighbor)

, К сожалению, у меня нет кода удобным, и, возможно, было немного больше к нему (я неопределенно вспоминаю, что рассмотрение диагонали граничит также, и корректировка sqrt(2) / 2). Я надеюсь это достаточно, чтобы дать Вам суть.

2
ответ дан erickson 27 November 2019 в 17:16
поделиться

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

, К счастью, Октава GNU, клон MATLAB, имеет реализации различных функций графического изображения контура. Вы могли посмотреть на тот код для алгоритма и реализации, это является почти наверняка математически звуковым. Или, Вы могли бы просто быть в состоянии разгрузить обработку к Октаве. Проверьте страницу на взаимодействие через интерфейс с другими языками , чтобы видеть, было ли это легче.

Раскрытие: Я не использовал Октаву очень, и я на самом деле не протестировал, это - графическое изображение контура. Однако на основе моего опыта с MATLAB, я могу сказать, что это даст Вам почти все, что Вы просите во всего нескольких строках кода, если Вы получаете свои данные в MATLAB.

кроме того, поздравления по случаю создания очень график VanGough-esque slopefield.

1
ответ дан user57368 27 November 2019 в 17:16
поделиться

Я всегда проверяю места как http://mathworld.wolfram.com прежде, чем идти в глубокий самостоятельно:)

, Возможно, их кривые раздел помог бы? Или возможно запись на карты .

0
ответ дан warren 27 November 2019 в 17:16
поделиться

сравните то, что Вы представили с реальной картой topo - они выглядят идентичными мне! я не изменил бы вещь...

0
ответ дан Steven A. Lowe 27 November 2019 в 17:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: