
Я построил пользовательскую форму с помощью pdfdeclareshape
и использую ее на следующей диаграмме
Я хотел бы вращать границу независимо от текста, чтобы в идеале она в конечном итоге выглядела примерно так, как на изображенииэтот вопрос.
Изучивpgf
руководство иКак вращать узел и текст независимо в Tikz(например), я думаю, что мне следует стремиться использовать shape border rotate
, но не все формы поддерживают его по умолчанию.
Можно ли вращать границу моей пользовательской фигуры независимо от текста? (Если мою пользовательскую фигуру можно улучшить, пожалуйста, не стесняйтесь критиковать ее.)
% 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}
решение1
Вы можете использовать , shape border rotate
который существует для некоторых фигур (или определить свой собственный специальный petal rotate
ключ). Однако, когда вы определяете новую фигуру, вам придется сделать всю работу самостоятельно. Рисование границы фигуры несложно, но вам может понадобиться вручную определить якоря, чтобы отразить значение в этом ключе (что здесь не сделано):
\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}
решение2
С помощью 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}