Определить растягиваемую штриховку

Определить растягиваемую штриховку

Я хотел бы определить горизонтальную штриховку, которая может быть растянута в зависимости от потребностей. Что я сделал слишком далеко, так это

\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}

но это просто не работает. Почему?

РЕДАКТИРОВАТЬ: Этонето причудливом фоне. Мне нужно представить изменения давления в воздухе, и у меня нет точных размеров прямоугольника. Если бы я знал точные размеры прямоугольника ( \leng), я мог бы использовать 0.25*\leng, 0.75*\lengи\leng

решение1

Как описано в руководстве, затенение масштабируется таким образом, что средние 50% заполняют контур, что, хотя и полезно во многих случаях (особенно при чрезмерно непрямоугольных контурах или повернутой заливке), в данном случае немного неудобно.

Однако можно воспользоваться этой path pictureфункцией, получить размер пути и вручную масштабировать затенение. Это включает в себя некоторые базовые манипуляции со слоями, и поворот затенения не поддерживается (по крайней мере, в примере ниже). Затенение по умолчанию находится слева, затенение изображения пути — справа:

\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}

введите описание изображения здесь

решение2

Ваша штриховка работает очень хорошо! В штриховке всегда есть некоторые скрытые части (см. pgfmanual стр.1090 TikZ/PGF v3.0).

Если вы хотите использовать всю заливку, вы можете использовать ее \pgfuseshading{pressure}в качестве содержимого узла, используя xscaleи yscaleдля изменения его размера (и inner sep=0для удаления нежелательных полей).

Редактировать:Используя calcбиблиотеку TikZ, вы можете рассчитать коэффициенты масштабирования.

введите описание изображения здесь

\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}

решение3

Вы всегда можете использоватькрасивыйизображение в качестве фона.

\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}

Растяните его с помощью widthключа.

введите описание изображения здесь

Связанный контент