TikZ: 角度のある色のグラデーションを持つ図形

TikZ: 角度のある色のグラデーションを持つ図形

Stack Overflow からのクロスポスト:

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

皆さん、素晴らしいですね! 角度のある色のグラデーションで図形を描こうとしているのですが、そのような図形を塗りつぶすための一般的な構文が見つかりません。このような図をたくさん描く必要がありますが、完成したらどのような見た目にしたいかという基本的なイメージをお伝えするために、次の画像を添付します。

ここに画像の説明を入力してください

つまり、私が欲しいのは、「グラデーションは角度 A で色 X から始まり、角度 B で色 Y で終わる」と指定できるものです。TikZ 画像にはそのような機能がありますか、それとも自分で何かを定義する必要がありますか?

皆様のご回答をお待ちしております!

私が思いついた唯一の方法は、この回答で説明されている方法を使用して背景として円形を作成し、そのほとんどを白で「隠して」、切り取った形状を残すことですが、このアプローチの問題は、見た目が洗練されていないだけでなく、複数の形状を隣り合わせにする必要がある場合には機能しないことです。

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

編集:コード スニペットを追加するように求められたので、次のコード スニペットを作成しました。これにより、希望するグラデーションはありませんが、私が思い描いていた図が生成されます。

\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}

生成された画像は次のようになります。

ここに画像の説明を入力してください

答え1

まあ、あなたに残っているわずかな髪の毛に敬意を表して、そして、それが知識の問題であり、実用的な答えを得る方法を見つけることだけの問題であることがわかるように、あなたが投稿した最初の画像ではデジタル フィルターの使用さえ必要であり、それは範囲を超えています。ユーザー レベルでは、それは LaTeX コア プログラマーとシェーディング用のスタイル ジェネレーターのプログラミングの対象になるはずですが、反復することでどれだけ近づけるかの例を次に示します。

結果:

ここに画像の説明を入力してください

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}

追加メモ:

  • Firefox PDF ビューアでは、シェーディングが機能しません。使用しているバージョンが原因かどうかはわかりませんが、Edge と Acrobat ではすべて正常です。

答え2

結局、pgfplot を使うのは、少なくとも私にとっては、適切にスケーリングするのが非常に難しいため、面倒すぎることがわかりました。1 日半頭を悩ませた後、あきらめて Inkscape を使うことにしました。次の背景画像を生成しました。

ここに画像の説明を入力してください

白い前景から必要な矢印を切り取ると、出来上がりです。

ここに画像の説明を入力してください

これにより、私が望む美観が得られ、操作も簡単になります。

関連情報