TikZ: Формы с угловым цветовым градиентом

TikZ: Формы с угловым цветовым градиентом

Кросс-постинг со Stack Overflow:

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

Добрые люди! Я пытаюсь нарисовать несколько фигур с угловым цветовым градиентом, но не могу найти общий синтаксис для заливки такой фигуры. Мне нужно будет нарисовать очень много таких диаграмм, но чтобы дать вам представление о том, как я хочу, чтобы эти штуки выглядели в конечном итоге, я прикрепляю эту картинку:

введите описание изображения здесь

Итак, мне нужно что-то, что позволит мне указать "градиент начинается с цвета X на угле A и заканчивается цветом Y на угле B". Есть ли такая функция у картинки 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

Ну, в знак уважения к тем немногим волоскам, которые у вас остались, и чтобы вы могли видеть, что это всего лишь вопрос знаний и поиска способа получить работоспособные ответы, потому что первое изображение, которое вы опубликовали, даже требует использования цифровых фильтров, а это выходит за рамки. На уровне пользователя это должно было бы стать предметом программирования ядра латекса и программирования генератора стилей для затенения, но вот пример того, насколько близко вы можете подойти, повторяя действия.

РЕЗУЛЬТАТ:

введите описание изображения здесь

МВЭ:

\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 Viewer не работает затенение, не знаю, связано ли это с моей версией, но в Edge и Acrobat все нормально.

решение2

В конце концов, использование pgfplot оказалось слишком сложным, по крайней мере для меня, поскольку их очень трудно правильно масштабировать. После того, как я рвал на себе волосы в течение полутора дней, я просто сдался и перешел на Inkscape. Я сгенерировал следующее фоновое изображение:

введите описание изображения здесь

Вырезал нужные мне стрелки из белого переднего плана, и вуаля:

введите описание изображения здесь

Это дает мне желаемую эстетику, которой легко манипулировать.

Связанный контент