Es ist alles ein bisschen einfacher zu diskutieren, wenn wir mit horizontalen Linien beginnen, etwa so:
Wie Ilmari Karonen sagte, ist dies nur eine Verschiebungskarte . Sie beginnen mit einer 3D-Topografie h ( x , y ), und dann sollte jeder Punkt ( x , y ) im Ergebnis die Linie verwenden, die bei y 0 = y − h ( x , y ) beginnt.
Mit Rastergrafiken kann dies sofort gerendert werden, aber um saubere Vektorlinien zu erhalten, müssten wir eigentlich andersherum vorgehen: Jede Linie sollte als parametrisiert werden
f y 0 ( x ) = y 0 + h ( x , f y 0 ( x ))
Das Problem ist, dass dies nur eine implizite Definitionsgleichung ist, weil das RHS y = f y 0 ( x ) enthält. Dies könnte mit Newton-Raphson gelöst werden, aber es gibt einen einfacheren Weg: Konstruieren Sie einfach die Linien, die von links nach rechts verlaufen, und gehen Sie an jedem Punkt nach oben oder unten, um die Gleichung zu erfüllen. Kontinuität vorausgesetzt, ist dies immer nur eine kleine Aktualisierung, sodass wir dort h als konstant annähern können.
Implementierung in Haskell:
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)
Dann mit einem geeigneten Bildeingang wie
wir bekommen Konturen wie
Vollständiger Code: https://gist.github.com/leftaroundabout/8b7075d25adecdf16806ea5d7a7ea2aa
Die Rotation zu diagonalen Linien bleibt als Übung übrig.
Dies ist im Grunde nur eine Verschiebungskarte, die auf eine Reihe von Linien angewendet wird.
Der schwierige Teil besteht darin, dass das Anwenden einer Displacement Map auf eine Bitmap-Textur die gesamte Textur dehnt und komprimiert, einschließlich der Linien und der Lücken zwischen ihnen. Um den Schattierungseffekt in Ihrem Beispielbild zu erzielen, sollten Sie nur die Lücken strecken, nicht die Linien selbst. Ich sehe zwei (oder vielleicht drei) Möglichkeiten, dies zu umgehen:
Verwenden Sie einen Vektorbild-Editor, der so konfiguriert werden kann, dass nur der Pfad der Linien verschoben wird, während ihre Breite unverändert bleibt. Ich bin mir nicht sicher, ob eine handelsübliche Vektorzeichensoftware (Illustrator, Inkscape usw.) dies unterstützt, aber wenn dies der Fall ist, würde dies wahrscheinlich das sauberste Ergebnis liefern.
Beginnen Sie in einem Bitmap-Editor (Photoshop, GIMP usw.) mit einer Textur, die aus abwechselnden schwarzen und weißen Streifen gleicher Breite besteht, wenden Sie die Displacement Map darauf an und verwenden Sie dann einen Kantenerkennungsfilter, um die Streifengrenzen in Linien umzuwandeln (bzw möglicherweise die verschobenen Streifengrenzen in einem Vektorzeichenprogramm automatisch nachzeichnen). Hier besteht das Risiko, dass die Qualität aufgrund von Aliasing leiden kann, es sei denn, Sie arbeiten mit einer sehr hohen Auflösung (und skalieren dann das Endergebnis herunter).
Schreiben Sie Ihre eigene Software, um eine der oben genannten Aufgaben auszuführen. Offensichtlich erfordert dies einige Programmierkenntnisse, die nicht jeder hat, aber was Grafikprogrammieraufgaben angeht, sollte dies eigentlich nicht besonders schwierig sein.
Ich habe tatsächlich Option 2 mit dem Verschiebungsfilter in GIMP getestet. Leider habe ich jetzt nicht wirklich Zeit, eine Schritt-für-Schritt-Anleitung zu schreiben (vielleicht später …), aber als Teaser hier das Endergebnis meines schnellen Experiments:
Die von Ilmari Karonen erwähnte „Verschiebung“ und der von Abdul Qayum erwähnte „Erleichterungseffekt“ sind fast dasselbe.
Hier sind einige Bilder vom Image Relief Algorithm und seiner Anwendung im Sicherheitsdruck . Wir verwenden ein Bild, um Zellen (oder Gitter) unregelmäßig zu machen (oder um eine Verschiebung zu haben) und zeichnen dann parallele Linien darauf.
Sie können diesen Algorithmus manuell implementieren oder eine Software wie GIMP Displacement Map oder JURA (verwendet von Abdul Qayum) verwenden.
Billy Kerr
aamee Händler
Tim