Обсуждать все это немного проще, если мы начнем с горизонтальных линий, например так:
Как сказала Илмари Каронен, это всего лишь карта смещения . Вы начинаете с трехмерной топографии h ( x , y ), а затем каждая точка ( x , y ) в результате должна использовать линию, начинающуюся с y 0 = y − h ( x , y ).
С растровой графикой это можно отобразить сразу, но для получения четких векторных линий нам на самом деле нужно работать наоборот: каждая линия должна быть параметризована как
ж у 0 ( Икс ) знак равно у 0 + час ( Икс , ж у 0 ( Икс ))
Проблема в том, что это только неявное определяющее уравнение, потому что RHS содержит y = f y 0 ( x ). Это можно решить с помощью Ньютона-Рафсона, но есть более простой способ: просто построить линии, идущие слева направо, и в каждой точке идти вверх или вниз по мере необходимости, чтобы выполнить уравнение. Предполагая непрерывность, это всегда просто небольшое обновление, поэтому мы можем аппроксимировать h как константу.
Реализация на Хаскеле:
type ℝ = Double
horizContourLine ::
((ℝ,ℝ) -> ℝ) -- ^ The topography/height function
-> (ℝ,ℝ) -- ^ x-interval on which to render the path
-> ℝ -- ^ Step size / resolution along the path
-> ℝ -- ^ Base-level y-coordinate of the line
-> [(ℝ,ℝ)] -- ^ Trail line
horizContourLine h (x₀,xe) δx y₀ = go (x₀,y₀)
where go (x,y) = (x,yTgt)
: if x<xe then go (x+δx, yTgt)
else []
where yTgt = y₀ + h (x,y)
Затем с подходящим вводом изображения, например
мы получаем контуры, как
Полный код: https://gist.github.com/leftaroundabout/8b7075d25adecdf16806ea5d7a7ea2aa
Вращение к диагональным линиям оставлено в качестве упражнения.
По сути, это просто карта смещения , примененная к набору линий.
Сложность заключается в том, что применение карты смещения к растровой текстуре приведет к растяжению и сжатию всей текстуры, включая линии и промежутки между ними. Чтобы получить эффект затенения на вашем примере изображения, вам нужно растянуть только промежутки, а не сами линии. Я вижу два (или, может быть, три) способа обойти это:
Используйте редактор векторных изображений, который можно настроить так, чтобы он смещал только путь линий, оставляя их ширину неизменной. Я не уверен, поддерживает ли это какое-либо обычное готовое программное обеспечение для векторной графики (Illustrator, Inkscape и т. д.), но если они это сделают, это, вероятно, даст самый чистый результат.
В редакторе растровых изображений (Photoshop, GIMP и т. д.) начните с текстуры, состоящей из чередующихся черных и белых полос одинаковой ширины, примените к ней карту смещения, затем используйте фильтр обнаружения краев, чтобы преобразовать границы полос в линии (или возможно, автоматически отследить смещенные границы полос в программе векторного рисования). Риск здесь заключается в том, что если вы не работаете с очень высоким разрешением (а затем уменьшаете окончательный результат), качество может пострадать из-за алиасинга.
Напишите свое собственное программное обеспечение, чтобы сделать одно из вышеперечисленного. Очевидно, что это требует некоторых навыков программирования, которые есть не у всех, но что касается задач графического программирования, это на самом деле не должно быть особенно сложным.
На самом деле я протестировал вариант 2, используя фильтр смещения в GIMP. К сожалению, у меня нет времени писать пошаговое руководство прямо сейчас (может быть, позже…), но в качестве тизера вот окончательный результат моего быстрого эксперимента:
«Смещение», о котором говорила Илмари Каронен, и «эффект облегчения», о котором говорил Абдул Каюм, — это почти одно и то же.
Вот несколько фотографий из алгоритма рельефа изображения и его применения в защищенной печати . Мы используем изображение, чтобы сделать ячейки (или сетки) нерегулярными (или иметь смещение), а затем рисуем на них параллельные линии.
Вы можете реализовать этот алгоритм вручную или использовать программное обеспечение, такое как карта смещения GIMP или JURA (используется Абдулом Каюмом).
Билли Керр
трейдеры
Тим