
He construido una forma personalizada usando pdfdeclareshape
y la estoy usando en el siguiente diagrama
Me gustaría rotar el borde independientemente del texto para que, idealmente, eventualmente se parezca a la imagen enesta pregunta.
Habiendo estudiado elpgf
manuales yCómo rotar un nodo y texto de forma independiente en Tikz(por ejemplo), creo que debería intentar utilizar shape border rotate
, pero no todas las formas lo admiten de forma predeterminada.
¿Se puede rotar el borde de mi forma personalizada independientemente de su texto? (Si mi forma personalizada se puede mejorar, no dude en dejarme criticarla).
% 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}
Respuesta1
Puede utilizar una shape border rotate
que existe para algunas formas (o definir su propia petal rotate
clave especial). Sin embargo, cuando defines una nueva forma, tienes que hacer todo el trabajo tú mismo. Dibujar el borde de la forma es sencillo, pero es posible que desees o tengas que definir manualmente los anclajes para reflejar el valor en esta clave (lo cual no se hace aquí):
\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}
Respuesta2
Con 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}