# Color gradient in a polygon along a specified direction

This code:

\documentclass[tikz,border=1mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{backgrounds}

\begin{document}
\begin{tikzpicture}[scale=4]
\begin{scope}[on background layer]
\draw[fill, top color=black, bottom color=white, shading=axis, shading angle=-33.02]
(1,1) -- (-1,1) -- (-1,0.8) -- (1,-0.5) -- cycle;
\end{scope}
\end{tikzpicture}
\end{document}


produces the following polygon with a color gradient orthogonal to the diagonal line.

I have two problems:

1) The gradient should always be orthogonal to the diagonal line. How can I compute automatically the right angle? Is there another way to define the direction of the gradient / shading?

2) The shading does not really go from white to black. I want the shading to be white at the diagonal line and black in the upper right corner. What is the right way to do that?

Only for comparism. Run with xelatex:

\documentclass[pstricks,border=1mm]{standalone}

\begin{document}
\psset{unit=4}
\begin{pspicture}(-1,-0.5)(1,1)
\psclip{\pspolygon[linestyle=none](1,1)(-1,1)(-1,0.8)(1,-0.5)}
\endpsclip
\pspolygon(1,1)(-1,1)(-1,0.8)(1,-0.5)
\end{pspicture}

\end{document}


• I would like to use as much as possible from the original code in the question. Is that not possible? Your code outputs the desired effect, but is quite different to mine. – Samuel Jan 10 at 14:19
• at least use shading angle=-33 – Herbert Jan 10 at 15:24

You definitely do not have to hardcode the shading angle. This answer comes with a style that can be used as

shading angle from={line from (-1,0.8) to (1,-0.5)}


which then inserts the appropriate shading angle

\documentclass[tikz,border=3.14mm]{standalone}
\usetikzlibrary{backgrounds,calc}

\begin{document}
\begin{tikzpicture}[scale=4,shading angle from/.style args={line from #1 to #2}{
insert path={let \p1=($#2-#1$),\n1={atan2(\y1,\x1)} in},