градиент является математическим оператором, который может помочь Вам.
, Если можно превратить интерполяцию в дифференцируемую функцию, градиент высоты будет всегда указывать в направлении самого крутого подъема. Все кривые равной высоты перпендикулярны градиенту высоты, оцененной в той точке.
Ваша идея о запуске с самой высокой точки разумна, но могла бы пропустить функции, если существует больше чем один локальный максимум.
я предложил бы
Поочередно, существует идущие квадраты алгоритм, который кажется соответствующим Вашей проблеме, хотя можно хотеть сглаживать результаты при использовании крупной сетки.
кривые topo, которые Вы хотите потянуть, изоповерхности из скалярного поля более чем 2 размера. Для изоповерхностей в 3 размерах, существует идущие кубы алгоритм.
В ответ на Ваш комментарий к @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]
Я хотел что-то вроде этого сам, но не нашел основанное на векторе решение.
А основанное на растре решение не состоит в том, что плохо, тем не менее, особенно, если Ваши данные основаны на растре. Если Ваши данные основаны на векторе также (другими словами, у Вас есть 3D модель Вашей поверхности), необходимо быть в состоянии сделать некоторую реальную математику для нахождения перекрестных кривых с горизонтальными плоскостями при переменных повышениях.
Для основанного на растре подхода, я смотрю на каждую пару соседних пикселей. Если Вы выше уровня контура, и каждый ниже, очевидно, линия контура работает между ними. Прием я раньше сглаживал линию контура, должен смешать цвет линии контура в оба пиксели, пропорциональные их близости с идеализированной линией контура.
, Возможно, некоторые примеры помогут. Предположим, что текущий пиксель при "повышении" 12 футов, сосед при повышении 8 футов, и линии контура составляют каждые 10 футов. Затем существует линия контура половина пути между; нарисуйте текущий пиксель цветом линии контура в 50%-й непрозрачности. Другой пиксель на уровне 11 футов и имеет соседа на уровне 6 футов. Окрасьте текущий пиксель в 80%-й непрозрачности.
alpha = (contour - neighbor) / (current - neighbor)
, К сожалению, у меня нет кода удобным, и, возможно, было немного больше к нему (я неопределенно вспоминаю, что рассмотрение диагонали граничит также, и корректировка sqrt(2) / 2
). Я надеюсь это достаточно, чтобы дать Вам суть.
Пришло в голову меня, которого, что Вы пытаетесь сделать, было бы довольно легко сделать в MATLAB, с помощью функции контура. Выполнение вещей как создание имеющих малую плотность приближений к Вашим контурам может, вероятно, быть сделано с некоторой довольно простой последующей обработкой контуров.
, К счастью, Октава GNU, клон MATLAB, имеет реализации различных функций графического изображения контура. Вы могли посмотреть на тот код для алгоритма и реализации, это является почти наверняка математически звуковым. Или, Вы могли бы просто быть в состоянии разгрузить обработку к Октаве. Проверьте страницу на взаимодействие через интерфейс с другими языками , чтобы видеть, было ли это легче.
Раскрытие: Я не использовал Октаву очень, и я на самом деле не протестировал, это - графическое изображение контура. Однако на основе моего опыта с MATLAB, я могу сказать, что это даст Вам почти все, что Вы просите во всего нескольких строках кода, если Вы получаете свои данные в MATLAB.
кроме того, поздравления по случаю создания очень график VanGough-esque slopefield.
Я всегда проверяю места как http://mathworld.wolfram.com прежде, чем идти в глубокий самостоятельно:)
, Возможно, их кривые раздел помог бы? Или возможно запись на карты .
сравните то, что Вы представили с реальной картой topo - они выглядят идентичными мне! я не изменил бы вещь...