旋转节点但不旋转其内容:椭圆装饰的情况

旋转节点但不旋转其内容:椭圆装饰的情况

我想做的事:绘制一个用凸起装饰的节点,但装饰从节点的右侧开始(即与平常相反)。

我为什么要这么做:我将有一个节点隐藏凸起部分连接得很奇怪,但我希望能够选择建立此连接的位置。幸运的是,我只需要“节点左侧”和“节点右侧”。

我认为解决方案是:我想我可以使用shape border rotate,这样只有边界将会旋转。定义:

  \newcommand{\drawprost}[2][加油!]{
    \节点[绘制,
           装饰,装饰={凹凸,镜子},
           #2,
           postaction={装饰,装饰={标记,标记=在位置 1 处
                        {\arrow[线宽=5pt,蓝色]{>}}}}]
          {#1};}

现在以下两个命令可以按预期工作:

  \drawprost{形状=梯形,形状边框旋转=180}
  \drawprost{shape=trapezium,shape border rotate=0}

第二幅图中丑陋的蓝色箭头被旋转了 180 度。但是,如果没有shape=trapeziumshape=ellipse,这就会失败。

一个丑陋的解决方案: 我想到唯一的解决方案是(使用ellipse,否则我甚至没有解决方案):

  \drawprost[\phantom{恭喜!}]{rotate=180,shape=椭圆,label=center:恭喜!}

也就是说,phantom标签,并重新绘制它。

问题:有没有更好的方法?如果能找到一种方法,将装饰的起点(旋转)移到任意给定点,那就更好了 :-)


完整代码

\documentclass{文章}
\usepackage{tikz}
\usetikzlibrary{装饰,装饰。路径变形,形状,装饰。标记}

\开始{文档}
\开始{tikzpicture}
  \newcommand{\drawprost}[2][加油!]{
    \节点[绘制,
           装饰,装饰={凹凸,镜子},
           #2,
           postaction={装饰,装饰={标记,标记=在位置 1 处
                        {\arrow[线宽=5pt,蓝色]{>}}}}]
          {#1};}

  \newlength\yshift
  %只有使用梯形我才能获得预期的结果。
  \foreach \shape in {,shape=梯形,shape=椭圆}
    \foreach \rotate in {0, 180}
    {
      \expandafter\drawprost\expandafter{%
        \shape,yshift=\yshift,形状边框旋转=\rotate};
      \global\advance\yshift -2厘米
    }

  %我想要的是:
  \drawprost[\phantom{恭喜!}]{yshift=\yshift,rotate=180,shape=ellipse,label=center:恭喜!}
\结束{tikzpicture}
\结束{文档}

答案1

困难的根源在于 TikZ 中的椭圆以特定方式构造。它们是从 x 轴开始并绕其中心逆时针行进的路径。绝大多数情况下,确切的参数化并不重要。你似乎找到了一种情况!

在实际问题中,您只希望能够镜像椭圆,因此从负 x 轴开始绘制它(问题标题表明了一种更灵活的方法)。这实际上并不太难,因为我们可以利用椭圆的对称性。关键是为其提供负 x 半径,因为这样它将从负 x 轴开始(并顺时针进行,但我们也可以通过取反 y 半径来纠正这一点)。为此,我们中断从节点形状到绘制命令的调用并翻转 x 半径的符号。最简单的方法是重新定义宏以执行取\pgfpathellipse反,然后调用原始宏。以下代码执行此操作。

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{decorations,shapes,decorations.markings}
\makeatletter
\let\origpgfpathellipse=\pgfpathellipse
\def\revpgfpathellipse#1#2#3{%
  #2%
  \pgf@xa=-\pgf@x
  \origpgfpathellipse{#1}{\pgfqpoint{\pgf@xa}{0pt}}{#3}}
\makeatother

\tikzset{
  reversed ellipse/.style={
    ellipse,
    reverse the ellipse%
  },
  reverse the ellipse/.code={
    \let\pgfpathellipse=\revpgfpathellipse
  }
}
\begin{document}
\begin{tikzpicture}
\node[ellipse,
  draw,
  postaction={
    decorate,
    decoration={
      markings,
      mark=at position 1 with {
        \arrow[line width=5pt,blue]{>}
      }
    }
  }
] at (0,0) {hello world};

\node[reversed ellipse,
  draw,
  postaction={
    decorate,
    decoration={
      markings,
      mark=at position 1 with {
        \arrow[line width=5pt,blue]{>}
      }
    }
  }
] at (0,-2) {hello world};
\end{tikzpicture}

\end{document}

结果如下:

旋转椭圆

(箭头被剪掉了,但你可以看到它的位置)

答案2

您可以将标签移动为宏的一部分,然后\phantom在宏内指定允许计算节点的宽度:

在此处输入图片描述

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{decorations,decorations.pathmorphing,shapes,decorations.markings}

\newcommand{\drawprost}[2][Prost!]{
    \node [draw,
           decorate,decoration={bumps,mirror},
           #2, label=center:#1,
           postaction={decorate,decoration={markings,mark=at position 1 with
                        {\arrow[line width=5pt,blue]{>}}}}]
          {\phantom{#1}};}

\begin{document}
\begin{tikzpicture}
  \drawprost[Prost!]{rotate=180,shape=ellipse}
\end{tikzpicture}
\end{document}

相关内容