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

글쎄, 당신이 남긴 작은 머리카락을 기리기 위해, 그리고 당신이 게시한 첫 번째 이미지에는 디지털 필터와 그것은 범위를 넘어서는 것입니다. 사용자 수준에서는 라텍스 코어 프로그래머의 주제가 되어야 하고 셰이딩을 위한 스타일 생성기를 프로그래밍해야 하지만 다음은 반복을 통해 얼마나 가까워질 수 있는지에 대한 예입니다.

결과:

여기에 이미지 설명을 입력하세요

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을 사용하는 것은 적절하게 확장하기가 매우 어렵기 때문에 적어도 나에게는 너무 혼란스러운 것으로 판명되었습니다. 하루 반 동안 머리를 찢다가 그냥 포기하고 Inkscape로 갔습니다. 다음과 같은 배경 이미지를 생성했습니다.

여기에 이미지 설명을 입력하세요

흰색 전경에서 원하는 화살표를 잘라내고 다음과 같이 합니다.

여기에 이미지 설명을 입력하세요

이를 통해 제가 원하고 조작하기 쉬운 미학을 얻을 수 있습니다.

관련 정보