TikZ: Formen mit eckigem Farbverlauf

TikZ: Formen mit eckigem Farbverlauf

Cross-Posting von Stack Overflow:

https://stackoverflow.com/q/78347764/2777074

Gute Leute! Ich versuche, einige Formen mit einem eckigen Farbverlauf zu zeichnen, kann aber die allgemeine Syntax zum Füllen einer solchen Form nicht finden. Ich werde eine ganze Menge dieser Diagramme zeichnen müssen, aber um Ihnen eine Vorstellung davon zu geben, wie diese Dinge grundsätzlich aussehen sollen, wenn sie fertig sind, füge ich dieses Bild an:

Bildbeschreibung hier eingeben

Ich möchte also etwas, mit dem ich angeben kann: „Der Farbverlauf beginnt mit Farbe X im Winkel A und endet mit Farbe Y im Winkel B.“ Verfügt das TikZ-Bild über eine solche Funktion oder muss man selbst etwas definieren?

Ich freue mich auf eure Antworten!

Das Einzige, was mir eingefallen ist, wäre, mit der in dieser Antwort beschriebenen Methode eine kreisförmige Form als Hintergrund zu erstellen und diese dann größtenteils mit Weiß zu „verstecken“, sodass ein Ausschnitt meiner Form übrig bleibt. Das Problem bei dieser Vorgehensweise ist jedoch nicht nur, dass sie irgendwie unelegant ist, sondern sie funktioniert auch nicht, wenn ich mehrere Formen nebeneinander haben muss.

https://stackoverflow.com/questions/72813749/tikz-fill-a-circle-with-shading-color-by-angle

BEARBEITEN:Da ich darum gebeten wurde, einige Code-Schnipsel hinzuzufügen, habe ich diesen zusammengestellt, der die Figur erzeugt, die ich mir vorstelle, allerdings ohne den gewünschten Farbverlauf:

\begin{tikzpicture}
\draw[thick, arrows=<->] (-5,0)--(5,0);
\draw[thick, arrows=<->] (0,-5)--(0,5);
\draw[fill=red, draw=none] (2.5,0) arc (0:225:2.5) -- (225:2.2) -- (243:3) -- (225:3.8)--(225:3.5) arc (225:0:3.5) -- cycle;
\draw[fill=blue, draw=none] (290:2.5) arc (290:335:2.5) -- (335:2.2) -- (353:3) -- (335:3.8) -- (335:3.5) arc (335:290:3.5) -- cycle;
\end{tikzpicture}

Das erzeugte Bild sieht wie folgt aus:

Bildbeschreibung hier eingeben

Antwort1

Nun, zu Ehren der wenigen Haare, die Sie noch haben, und damit Sie sehen, dass es nur eine Frage des Wissens ist und dass man einen Weg finden muss, um brauchbare Antworten zu erhalten, denn das erste Bild, das Sie gepostet haben, erfordert sogar die Verwendung digitaler Filter und das geht über den Rahmen hinaus. Auf Benutzerebene müsste es Gegenstand eines Latex-Kernprogrammierers und der Programmierung eines Stilgenerators für die Schattierung sein, aber hier ist ein Beispiel, wie nahe Sie durch Iteration herankommen können.

ERGEBNIS:

Bildbeschreibung hier eingeben

MWE:

\documentclass[border=5pt,tikz]{standalone}
\usepackage{ifthen}
\definecolor{CusRed}{HTML}{FC003C}
\definecolor{CusBlue}{HTML}{00B3F6}
\definecolor{CusGreen}{HTML}{02A89D}

\usetikzlibrary{decorations.pathmorphing,arrows.meta,shadings}

\def\arcArrow[#1][#2][#3](#4)(#5)(#6)#7{%\arcArrow[Type][Color][Width](main_radius)(start_angle)(end angle){arrow tip-size_in degrees}
    \def\pathA{(#5:#4cm+#3)
        arc (#5:#6:#4cm+#3)
        -- (#6:#4)
        -- (#6:#4cm-#3) 
        arc (#6:#5:#4cm-#3)
        -- (#5:#4cm-#3*1.7)
        -- (#5+#7:#4cm)
        -- (#5:#4cm+#3*1.7)
        -- cycle;}
    \ifthenelse{\equal{#1}{pencildraw}}{
        \shade[pencildraw,line width=1pt,upper left=#2,
        upper right=white,
        lower left=#2,
        lower right=white, shading angle=#6]\pathA
    }{
        \ifthenelse{\equal{#1}{PseudoStroke}}{
                \begin{scope}
                    \clip
                    \pathA
                    \pgfmathparse{int(#6+1)}
                    \xdef\Shift{\pgfmathresult}
                    \foreach \j [evaluate=\j as \xn using {(\j-#6)/(#5-#6)}] in {#6,\Shift,...,#5}{
                        \fill[#2,opacity=\xn*\xn*0.4](\j:#4cm-#3) circle(#3*\xn*2.5+rand*rand*1.5mm);
                        \fill[#2,opacity=\xn*\xn*0.4](\j:#4cm+#3) circle(#3*\xn*2.5+rand*rand*1.5mm);
                        \fill[#2,opacity=\xn*\xn*0.4](\j:#4cm) circle(#3*\xn*2.5+rand*rand*1.5mm);
                    }
                \end{scope} 
            }
            {
                \shade[upper left=#2,upper right=white,lower left=#2,lower right=white, shading angle=#6]\pathA 
        }
    }
}

\begin{document}
    \begin{tikzpicture}[
        >=Triangle,%Style for arrow tip
        pencildraw/.style={%fancy style for hand drawing lines
            decorate,
            decoration={random steps,segment length=2pt,amplitude=0.5pt}
        }
    ]
    
    % This is where the drawing just begins.
        \arcArrow[pencildraw][CusRed][7pt](2)(245)(0){10};
        \arcArrow[pencildraw][CusBlue][7pt](2)(340)(285){10};
        \arcArrow[Normal][CusRed][5pt](4)(90-10)(0){5};
        \arcArrow[Normal][CusRed][5pt](4)(180-10)(90){5};
        \arcArrow[Normal][CusRed][5pt](4)(270-10)(180){5};
        \arcArrow[Normal][CusRed][5pt](4)(360-10)(270){5};
        \arcArrow[PseudoStroke][CusRed][8pt](3)(245)(0){8};
        %a combination of two styles
        \arcArrow[pencildraw][CusGreen][8pt](3)(360)(275){8};
        \arcArrow[PseudoStroke][CusGreen][8pt](3)(360)(275){8};
        %Some aditional standard drawings.
        \draw[<->,pencildraw](180:5cm) -- (0:5cm);
        \draw[<->,pencildraw](-90:5cm) -- (90:5cm);
        \draw[pencildraw](0,0) circle (0.5cm);
        
    \end{tikzpicture}
    
\end{document}

Zusätzliche Anmerkung:

  • Im Firefox PDF Viewer funktionieren die Schattierungen nicht, ich weiß nicht, ob es an meiner Version liegt, aber in Edge und Acrobat ist alles normal.

Antwort2

Am Ende erwies sich die Verwendung von pgfplot als zu umständlich, zumindest für mich, da es sehr schwierig ist, diese richtig zu skalieren. Nachdem ich mir anderthalb Tage lang die Haare gerauft hatte, gab ich einfach auf und entschied mich für Inkscape. Ich habe das folgende Hintergrundbild generiert:

Bildbeschreibung hier eingeben

Schneiden Sie die gewünschten Pfeile aus einem weißen Vordergrund aus, und presto:

Bildbeschreibung hier eingeben

Dadurch erhalte ich die gewünschte Ästhetik, die sich außerdem leicht bearbeiten lässt.

verwandte Informationen