[Tex/LaTex] Tikz clip shapes with another (built in) shape

path-clippingtikz-pgf

I have some geometry that I need to clip. I would like to use the built in node shapes like diamonds, stars, etc…

http://www.texample.net/tikz/examples/node-shapes/

Basically I use standard tikz draw commands to generate the picture I want but then I want to clip them according to some built in shape(or even custom shape).

\documentclass{article}

\usepackage{tikz}
\begin{document}
\scrollmode


\begin{tikzpicture}

  \begin{scope}
    \clip (0,0) diamond (1cm);
    \fill[black] (0cm,1cm) rectangle (-1cm, -1cm);
  \end{scope}

\end{tikzpicture}
\end{document}

I need someway to specify the size of the clip shape also.

Best Answer

Normally \node does not accept the clip option for its path use. Well it does but since the node shape drawing is scoped it doesn't affect the rest of the picture. That's why path picture in Qrrbrbirlbel's answer is possible. But the lower level PGF version survives for the rest of the picture. It's a little bit more laborous but essentially the same idea.

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{shapes.geometric}
\begin{document}
\begin{tikzpicture}

  \begin{scope}
    %\pgfset{shape aspect=0.5} Uncomment this and remove minimum size for this option
    \pgfset{minimum size=3cm,inner sep=2mm}
    \pgfnode{diamond}{center}{}{nodename}{\pgfusepath{stroke,clip}}
    \fill[black] (-1cm,-1cm) rectangle (1cm, 1cm);
  \end{scope}

\end{tikzpicture}
\end{document}

enter image description here

There is a problem here about the bounding box. The actual bounding box is computed by the size of the rectangle if too large even if it is clipped. So one should do another trick after everything is drawn outside the scope, say with an additional node via [use as bounding box].

update (altermundus)

\fbox{\begin{tikzpicture}
    \begin{scope}
        [local bounding box=bb]  \node  [draw,shape=diamond,minimum size=3cm,inner sep=2mm]{};  
    \end{scope}
      \pgfset{minimum size=3cm,inner sep=2mm}
      \pgfnode{diamond}{center}{}{nodename}{\pgfusepath{stroke,clip}}
      \fill[black] (-3cm,-1cm) rectangle (3cm, 1cm);
      \pgfresetboundingbox
       \useasboundingbox (bb.south west) rectangle  (bb.north east);
  \end{tikzpicture}} 

enter image description here


EDIT: Regarding the position of the clipping node...

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{shapes.callouts,shapes.geometric}
\begin{document}
\begin{tikzpicture}
\draw[top color= black!50] (-2,-2) rectangle (5,4);
\begin{scope}   
    \pgfset{minimum width=5cm,minimum height=3cm}
    \pgfsetlinewidth{1mm}
    \pgftransformshift{\pgfpoint{1.5cm}{1.5cm}}
    \pgfnode{cloud callout}{center}{}{nodename}{\pgfusepath{stroke,clip}}
    %Cleaning up the mess we caused
    \pgftransformreset
    \pgfsetlinewidth{0.4pt} 
    \pgfset{minimum width=1pt,minimum height=1pt}
    % Back to drawing
    \fill[white] (-2cm,-2cm) rectangle (5cm,4cm);
    \fill[red] (0cm,0cm) rectangle (1.5cm, 1.5cm);
    \fill[yellow] (2cm,2cm) circle (1cm);
    \node[fill=blue,rotate=90,isosceles triangle,draw,minimum height=1.5cm] at (2.5cm,1cm) {};
\end{scope}
\node[align=center,draw,anchor=north west] (a) at (nodename.pointer) {Geometric\\Thinker};
\end{tikzpicture}
\end{document}

enter image description here