Dehnbare Schattierung definieren

Dehnbare Schattierung definieren

Ich möchte eine horizontale Schattierung definieren, die je nach Bedarf gestreckt werden kann. Was ich bisher getan habe, ist dies

\documentclass{standalone}
\usepackage{tikz}

\begin{document}
\begin{tikzpicture}
\pgfdeclarehorizontalshading{pressure}{1cm}{color(0cm)=(black!30); color(1cm)=(black!50); color(3cm)=(black!10); color(4cm)=(black!30)}
\shade[shading=pressure] (0,0) rectangle (10cm,2cm);
\end{tikzpicture}

\end{document}

aber es funktioniert einfach nicht. Warum?

BEARBEITEN: Das istnichtüber ausgefallenen Hintergrund. Ich muss die Änderungen des Luftdrucks darstellen und habe keine genauen Maße des Rechtecks. Hätte ich die genauen Maße des Rechtecks ​​gekannt ( \leng), könnte ich verwenden 0.25*\leng, 0.75*\lengund\leng

Antwort1

Wie im Handbuch beschrieben, wird die Schattierung so skaliert, dass die mittleren 50 % den Pfad ausfüllen, was zwar in vielen Fällen nützlich ist (insbesondere bei übermäßig nicht rechteckigen Pfaden oder gedrehten Schattierungen), in diesem Fall jedoch etwas störend ist.

Man kann diese Funktion jedoch ausnutzen path picture, die Größe des Pfads ermitteln und die Schattierung manuell skalieren. Dies erfordert einige grundlegende Ebenentricks und es wird keine Schattierungsrotation unterstützt (zumindest im folgenden Beispiel). Die Standardschattierung befindet sich links, die Schattierung des Pfadbilds befindet sich rechts:

\documentclass[tikz,border=5]{standalone}
\usetikzlibrary{calc}
\newbox\shbox
\tikzset{%
  path picture shading/.style={%
    path picture={%
%
\pgfpointdiff{\pgfpointanchor{path picture bounding box}{south west}}%
  {\pgfpointanchor{path picture bounding box}{north east}}%
\pgfgetlastxy\pathwidth\pathheight%
\pgfinterruptpicture%
   \global\setbox\shbox=\hbox{\pgfuseshading{#1}}%
 \endpgfinterruptpicture%
\pgftransformshift{\pgfpointanchor{path picture bounding box}{center}}%
\pgftransformxscale{\pathwidth/(\wd\shbox)}%
\pgftransformyscale{\pathheight/(\ht\shbox)}% \dp will (should) be 0pt
\pgftext{\box\shbox}%
%
    }
  }
}
\pgfdeclarehorizontalshading{pressure}{25bp}{color(0bp)=(red); color(25bp)=(yellow); color(50bp)=(pink); color(75bp)=(green); color(100bp)=(blue)}


\begin{document}
\begin{tikzpicture}
\node at (3,0) {\tt shading=pressure};
\node at (9,0) {\tt path picture shading=pressure};
\foreach \i in {1,...,6}{
\draw [shading=pressure] (0,\i) rectangle +(\i,1);
\draw [path picture shading=pressure] (7,\i) rectangle +(\i,1);
}
\end{tikzpicture}
\end{document}

Bildbeschreibung hier eingeben

Antwort2

Ihre Schattierung funktioniert sehr gut! Es gibt immer einige versteckte Teile in einer Schattierung (vgl. pgfmanual S. 1090 von TikZ/PGF v3.0).

Wenn Sie die gesamte Schattierung verwenden möchten, können Sie sie \pgfuseshading{pressure}als Inhalt eines Knotens verwenden xscaleund yscaleihre Größe ändern (und inner sep=0unerwünschte Ränder entfernen).

Bearbeiten:Mithilfe der calcTikZ-Bibliothek können Sie die Skalierungsfaktoren berechnen.

Bildbeschreibung hier eingeben

\documentclass[tikz]{standalone}
\usetikzlibrary{calc}
\pgfdeclarehorizontalshading{pressure}{1cm}{
  color(0cm)=(red);
  color(1cm)=(black!50);
  color(2cm)=(yellow!10);
  color(3cm)=(blue)
}
\begin{document}
\begin{tikzpicture}
  \node[inner sep=0,xscale=10/3,yscale=2/1]
  at (0,0) {\pgfuseshading{pressure}};
  \node[inner sep=0,xscale=10/3,yscale=.5/1]
  at (0,2) {\pgfuseshading{pressure}};

  \coordinate (a) at (-2,5);
  \coordinate (b) at (8,6);

  \path let \p1=(a), \p2=(b),
  \p3=({(\x2-\x1)/3cm},{(\y2-\y1)/1cm}),
  \p4=($(\p1)!.5!(\p2)$)
  in node[at=(\p4),inner sep=0,xscale=\x3,yscale=\y3]{\pgfuseshading{pressure}};
\end{tikzpicture}
\end{document}

Antwort3

Sie können jederzeit einSchönBild als Hintergrund.

\documentclass{article}
\usepackage{tikz, graphicx}

\begin{document}
\begin{tikzpicture}
\node[inner sep=0pt] (x) at (0,0)
    {\includegraphics[width=.5\textwidth]{bg.jpg}};
\node[inner sep=0pt] (y) at (5,-6)
    {\includegraphics[width=.25\textwidth]{bg.jpg}};
\draw[<->,thick] (x.south east) -- (y.north west)
    node[midway,fill=white] {Backgrounds};
\end{tikzpicture}
\end{document}

Dehnen Sie es mithilfe der widthTaste.

Bildbeschreibung hier eingeben

verwandte Informationen