TikZ 中因顶点而产生的阴影

TikZ 中因顶点而产生的阴影

我在 TikZ 中遇到了阴影问题。我想将四边形面片图转换为 TikZ。

我所知道的 - 矢量顶点坐标和连接 列表补丁。
我不知道的是 - 顶点的顺序连接 列表

我已设法获得矩形的正确顺时针顺序。但是对于任意形状的四边形,我无法确定哪个特定顶点位于upper right角、upper left角等处。

\documentclass[tikz]{standalone}
\usepackage{tikz}
\usetikzlibrary{shadings}

\begin{document}
\begin{tikzpicture}
    \fill [fill,
           upper right=red, 
           upper left=blue, 
           lower left=green,
           lower right=yellow]
          (-1,-1) -- (-1,1) -- (1,1) -- (1,-1) -- cycle;
    % coordinates description was added in picture below 
\end{tikzpicture}
\end{document}

插图图像。

我需要在图像上得到类似的东西,但要为特定的顶点分配颜色(Ab,...),而不是特定的角落。

有人知道如何实现这一点吗?

答案1

这是一项提案,语法尚待商议。基本要点是可以使用阴影角度旋转阴影。可以使用 计算此阴影角度calc。语法类似于

\path[shaded quadrilateral={(-1,-1)--(-1,1)--(1,1)--(1,-1)}];

其中第一种颜色与第一个顶点相关联,第二种颜色与第二个顶点相关联,依此类推。颜色存储在 pgf 键中,如以下 MWE 所示。限制是形状需要有 4 个角。

\documentclass[tikz]{standalone}
\usepackage{tikz}
\usetikzlibrary{shadings,calc}

\begin{document}
\begin{tikzpicture}[font=\sffamily,
  shaded quadrilateral/.style args={#1--#2--#3--#4}{
  insert path={($0.25*#1+0.25*#2+0.25*#3+0.25*#4$) coordinate (auxsq)
  let \p1=($#1-(auxsq)$),\n1={atan2(\y1,\x1)},
  \p2=($#2-(auxsq)$),\n2={atan2(\y2,\x2)-\n1)}
   in [/utils/exec=\pgfmathtruncatemacro{\itest}{sign(sin(\n2-\n1))}]
    \ifnum\itest=1 
            [upper right=\pgfkeysvalueof{/tikz/sq/color 1}, 
             upper left=\pgfkeysvalueof{/tikz/sq/color 2}, 
             lower left=\pgfkeysvalueof{/tikz/sq/color 3},
             lower right=\pgfkeysvalueof{/tikz/sq/color 4},shading angle=\n1-45] 
      \else
             [upper right=\pgfkeysvalueof{/tikz/sq/color 1}, 
             upper left=\pgfkeysvalueof{/tikz/sq/color 4}, 
             lower left=\pgfkeysvalueof{/tikz/sq/color 3},
             lower right=\pgfkeysvalueof{/tikz/sq/color 2},shading angle=\n1-45] 
       \fi               
      #1--#2--#3--#4-- cycle
  }},sq/.cd,color 1/.initial=red,color 2/.initial=blue,color 3/.initial=green,
  color 4/.initial=yellow]
 \begin{scope}[local bounding box=normal]
  \path[shaded quadrilateral={(-1,-1)--(-1,1)--(1,1)--(1,-1)}];
 \end{scope}
 \node[above] at (normal.north) {normal use};
 %
 \begin{scope}[xshift=3cm,local bounding box=perm]
  \path[shaded quadrilateral={(1,1)--(1,-1)--(-1,-1)--(-1,1)}];
 \end{scope}
 \node[above,align=center] at (perm.north) {permutations\\ of the vertices};
 %
 \begin{scope}[yshift=-3cm,local bounding box=cols,
  sq/.cd,color 1=magenta,color 2=red,color 3=cyan,color 4=black]
  \path[shaded quadrilateral={(1,1)--(1,-1)--(-1,-1)--(-1,1)}];
 \end{scope}
 \node[above] at (cols.north) {color change};
 %
 \begin{scope}[xshift=3cm,yshift=-3cm,local bounding box=rot]
  \path[shaded quadrilateral={(30:{sqrt(2)})--(120:{sqrt(2)})--(210:{sqrt(2)})--(300:{sqrt(2)})}];
 \end{scope}
 \node[above,align=center] at (rot.north) {rotated};
 %
 \pgfmathsetseed{2019}
 \begin{scope}[yshift=-6.5cm,local bounding box=rand1,
  sq/.cd,color 1=magenta,color 2=red,color 3=cyan,color 4=black]
  \path[shaded quadrilateral={(90*rnd:1+0.7*rnd)--(90+90*rnd:1+0.7*rnd)--(180+90*rnd:1+0.7*rnd)--(270+90*rnd:1+0.7*rnd)}];
 \end{scope}
 \node[above] at (rand1.north) {random 1};
 %
 \begin{scope}[xshift=3cm,yshift=-6.5cm,local bounding box=orientation]
  \path[shaded quadrilateral={(-1,-1)--(1,-1)--(1,1)--(-1,1)}];
 \end{scope}
 \node[above,align=center] at (orientation.north) {orientation\\ change};
\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容