![TikZ 中因顶点而产生的阴影](https://linux22.com/image/478202/TikZ%20%E4%B8%AD%E5%9B%A0%E9%A1%B6%E7%82%B9%E8%80%8C%E4%BA%A7%E7%94%9F%E7%9A%84%E9%98%B4%E5%BD%B1.png)
我在 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}
我需要在图像上得到类似的东西,但要为特定的顶点分配颜色(A,b,...),而不是特定的角落。
有人知道如何实现这一点吗?
答案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}