Girar uma forma personalizada independentemente do texto

Girar uma forma personalizada independentemente do texto

Eu construí uma forma personalizada usando pdfdeclareshapee estou usando-a no diagrama a seguir

captura de tela

Eu gostaria de girar a borda independentemente do texto para que, idealmente, ela eventualmente se pareça com a imagem emessa questão.

Tendo estudado opgfmanual eComo girar um nó e um texto de forma independente no Tikz(por exemplo), acho que deveria tentar usar shape border rotate, mas nem todas as formas suportam isso por padrão.

A borda da minha forma personalizada pode ser girada independentemente do texto? (Se minha forma personalizada puder ser melhorada, sinta-se à vontade para criticá-la.)

% arara: pdflatex
\documentclass[tikz]{standalone}

\makeatletter
\pgfdeclareshape{petal}
{
    \inheritsavedanchors[from=circle] % this is nearly a circle
    \inheritanchorborder[from=circle]
    \inheritanchor[from=circle]{center}
    \inheritanchor[from=circle]{base}
    \backgroundpath{
        % origin
        \centerpoint%
        \pgf@xc=\pgf@x%
        \pgf@yc=\pgf@y%
        \pgfutil@tempdima=\radius%
        \pgfpathmoveto{\pgfpointadd%
            {\pgfqpoint{\pgf@xc}{\pgf@yc}}
            {\pgfqpoint{-\pgfutil@tempdima}{0\pgfutil@tempdima}}}
        \pgfpatharc{180}{0}{\pgfutil@tempdima}
        \pgfpathcurveto{%
            \pgfpointadd{\pgfqpoint{\pgf@xc}{\pgf@yc}}{\pgfqpoint{0.9\pgfutil@tempdima}{-.9\pgfutil@tempdima}}}
            {\pgfpointadd{\pgfqpoint{\pgf@xc}{\pgf@yc}}{\pgfqpoint{0.5\pgfutil@tempdima}{-.5\pgfutil@tempdima}}}
            {\pgfpointadd{\pgfqpoint{\pgf@xc}{\pgf@yc}}{\pgfqpoint{0\pgfutil@tempdima}{-1.5\pgfutil@tempdima}}}
        \pgfpathcurveto{%
            \pgfpointadd{\pgfqpoint{\pgf@xc}{\pgf@yc}}{\pgfqpoint{0\pgfutil@tempdima}{-1.5\pgfutil@tempdima}}}
            {\pgfpointadd{\pgfqpoint{\pgf@xc}{\pgf@yc}}{\pgfqpoint{-0.8\pgfutil@tempdima}{-.8\pgfutil@tempdima}}}
            {\pgfpointadd{\pgfqpoint{\pgf@xc}{\pgf@yc}}{\pgfqpoint{-\pgfutil@tempdima}{0\pgfutil@tempdima}}}
    }
}
\makeatother

\begin{document}
\begin{tikzpicture}
    \foreach \i in {1,2,...,5}
    {
        \pgfmathparse{90-(\i-1)*360/5}
        \node[draw=black,anchor=base,rotate=-(\i-1)*360/5,petal,minimum width=1.5cm] at (\pgfmathresult:1.2cm)  {\i};
    }
\end{tikzpicture}

\end{document}

Responder1

Você pode usar um shape border rotateque existe para algumas formas (ou definir sua própria petal rotatechave especial). Ao definir uma nova forma, entretanto, você terá que fazer todo o trabalho sozinho. Desenhar a borda da forma é simples, mas você pode querer/ter que definir manualmente as âncoras para refletir o valor nesta chave (o que não é feito aqui):

\documentclass[tikz]{standalone}

\makeatletter
\pgfkeys{/pgf/shape border rotate/.initial=0}

\pgfdeclareshape{petal}
{
    \inheritsavedanchors[from=circle] % this is nearly a circle
    \inheritanchorborder[from=circle]
    \inheritanchor[from=circle]{center}
    \inheritanchor[from=circle]{base}
    \savedmacro\petalparameters{%
      \pgfmathsetmacro\shapeborderrotate{\pgfkeysvalueof{/pgf/shape border rotate}}%
      \addtosavedmacro\shapeborderrotate%
    }
    \backgroundpath{
      % origin
      \petalparameters%
      {% Make sure transformations are  inside group.
         \pgftransformshift{\centerpoint}%
        \pgftransformrotate{\shapeborderrotate}%
        \pgfutil@tempdima=\radius%
        \pgfpathmoveto{\pgfqpoint{\pgfutil@tempdima}{0pt}}%
        \pgfpatharc{0}{180}{\pgfutil@tempdima}%
        \pgfpathcurveto{\pgfqpoint{-\pgfutil@tempdima}{-.5\pgfutil@tempdima}}%
          {\pgfqpoint{-.5\pgfutil@tempdima}{-.75\pgfutil@tempdima}}%
          {\pgfqpoint{0pt}{-1.5\pgfutil@tempdima}}
        \pgfpathcurveto{\pgfqpoint{0pt}{-.75\pgfutil@tempdima}}%
          {\pgfqpoint{\pgfutil@tempdima}{-.75\pgfutil@tempdima}}%
          {\pgfqpoint{\pgfutil@tempdima}{0pt}}%
      }%
   }
}
\makeatother

\begin{document}
\begin{tikzpicture}
    \foreach \i in {1,2,...,5}
    {
        \pgfmathparse{90-(\i-1)*360/5}
        \node[draw=black,anchor=base,shape border rotate=-(\i-1)*360/5,petal,minimum width=1.5cm] at (\pgfmathresult:1.25cm)  {\i};
    }
\end{tikzpicture}

\end{document}

insira a descrição da imagem aqui

Responder2

Com PSTricks.

\documentclass[pstricks,border=12pt]{standalone}
\usepackage{multido}
\psset{linejoin=1}
\SpecialCoor
\def\atom#1%
{
    \psccurve(0,0)(.3,.5)(1,1)(1,1.5)(0,2)(-1,1.5)(-1,1)
    \rput{*0}(0,1){#1}
}

\begin{document}
\begin{pspicture}[showgrid=false](-3,-3)(3,3)
    \multido{\ia=90+-72,\ib=0+-72,\in=1+1}{5}{\rput(.5;\ia){\rput{\ib}(0,0){\atom{\in}}}}
\end{pspicture}
\end{document}

insira a descrição da imagem aqui

informação relacionada