在 Tikz 中使用参数操作绘制形状

在 Tikz 中使用参数操作绘制形状

我想绘制一个我想重复使用的形状。此形状由新命令中的几何输入参数(距离、半径)定义。因此,我想执行一些操作来定义例如形状的中心。

也许我没有正确处理这个问题,因为我还希望这个形状能够与节点属性一起工作,使用锚点,而不仅仅是形状的原点进行放置。

这是我的小代码。提前谢谢您。

\documentclass[border=2mm]{standalone} %<--- standalone
\usepackage{tikz}


\newcommand{\hinge}[3] % #1 = name , #2 = rotation angle
{
\draw[black, line width=1mm] (#1-#3,#2+#3)--++(1,0)--++(0:0) arc(0:180:-1)--++(1,0)--++(0,-2.1)--++(-1,0)--++(0:0) arc(0:180:1)--++(-1,0)--cycle;
}


\begin{document}


\begin{tikzpicture}
\hinge(0,0,1);
\draw[red] (0,0) circle (0.1);
\end{tikzpicture}
\end{document}

答案1

我和@marmot 有同样的想法:你应该使用图片来实现这一点——但我也非常喜欢 Ignasi 的方法!

上面的大多数解决方案似乎都不能满足您对节点坐标的要求,并且形状没有进一步的样式化。使用图片很容易做到这两项工作,您可以在 tikz 手册(版本 3.0.1a)的第 18.2 节中阅读更多相关信息。

具体来说,您可以创建类似以下内容的内容:

在此处输入图片描述

使用代码:

\documentclass[border=2mm]{standalone} %<--- standalone
\usepackage{tikz}

\tikzset{
  pics/hinge/.style args = {#1,#2}{% name, style
     code = {
        \draw[black, line width=1mm, #2]
        (0,0)--++(1,0)--++(0:0) arc(0:180:-1) node[pos=0.5](#1){}
              --++(1,0)--++(0,-2.1)--++(-1,0)--++(0:0) arc(0:180:1)
              --++(-1,0)--cycle;
     }
  }
}

\begin{document}

  \begin{tikzpicture}
    \draw (4,4) pic{hinge={first,blue}};
    \pic at (0,0) {hinge={second,{red,rotate=30}}};
    \draw (0,4) pic{hinge={third,scale=0.4}};
    \draw[thick,->](first)--(second);
  \end{tikzpicture}

\end{document}

\draw正如我所展示的,你可以使用命令或命令来放置图片\pic。我定义了一个名为的图片hinge,它需要两个强制的参数:

  • 节点名称,位于图片的中心
  • 以及任何造型

两个参数hinge都是必需的,但您可以使用逗号省略其中一个:

\draw (4,0) pic{hinge={fourth,}};

是完全有效的——但要小心,因为如果你尝试以下操作,你将收到一个严重的错误和模糊的消息:

\draw (4,0) pic{hinge={fourth}};

最后,由于图片是相对于放置点绘制的,因此使用\draw\pic,我删除了(#1-#3,#2+#3)。如果确实需要,可以很容易地重新添加,因为图片可以接受许多参数,尽管在某些时候使用键会更容易。

答案2

我可能误读了这个问题,但如果你想给这个东西节点式的锚点,你可能需要使用pic。在下面的例子中,我给这个东西命名X,并从它的东北角画一条 45 度线。

\documentclass[border=2mm]{standalone} %<--- standalone
\usepackage{tikz}
\tikzset{pics/.cd,
hinge/.style args={#1/#2/#3}{code={
\draw[black, line width=1mm] (#1-#3,#2+#3)--++(1,0)--++(0:0) arc(0:180:-1)--++(1,0)--++(0,-2.1)--++(-1,0)--++(0:0) arc(0:180:1)--++(-1,0)--cycle;
}}}


\begin{document}
\begin{tikzpicture}
\pic[local bounding box=X] at (0,0) {hinge={0/0/1}};
\draw (X.north east) -- ++ (1,1);
\draw[red] (0,0) circle (0.1);
\end{tikzpicture}
\end{document}

在此处输入图片描述

答案3

您也可以使用矩形节点,但根据选项带有边框和填充path picture

\documentclass[border=2mm]{standalone} %<--- standalone
\usepackage{tikz}
\usetikzlibrary{positioning}

\begin{document}
\begin{tikzpicture}[hinge/.style 2 args={
    path picture={%
        \draw[#1] 
            ([xshift=-#2]path picture bounding box.south) arc(180:0:#2) 
            -|(path picture bounding box.north east)
            --([xshift=#2]path picture bounding box.north) arc(0:-180:#2) 
            -|(path picture bounding box.south west)--cycle;
    }},
    hinge/.default={}{5mm}
]

\node[minimum width=4cm, minimum height=2cm,
, hinge] (a) {Some text inside};
\node[minimum width=2cm, minimum height=1cm,
, hinge={fill=red!30}{2mm}, above right=0pt of a] (b) {Test};

\node[minimum width=2cm, minimum height=1cm,
, hinge={draw=green,fill=blue!30}{2mm}, right= of a] (c) {Test 2};
\end{tikzpicture}
\end{document}

在此处输入图片描述

答案4

使用 创建命令时\newcommand,参数必须在括号内给出,因此要使命令起作用,您需要使用\hinge{0}{0}{1}。要保留使用语法并保持命令 Ti类似 Z,你可以使用xparse

\documentclass[border=2mm]{standalone} %<--- standalone
\usepackage{tikz}
\usepackage{xparse}

\NewDocumentCommand{\hinge}
  { >{ \SplitArgument{2}{,} } r() } % #1 = name , #2 = rotation angle
  {%
    \hingeMAIN#1%
  }
\newcommand\hingeMAIN[3]{%
    \draw [black, line width = 1mm]
      (#1-#3,#2+#3)--++(1,0)--++(0:0) arc(0:180:-1)--++(1,0)--++(0,-2.1)--++(-1,0)--++(0:0) arc(0:180:1)--++(-1,0)--cycle;
}

\begin{document}

\begin{tikzpicture}
\hinge(0,0,1);
\draw[red] (0,0) circle (0.1);
\end{tikzpicture}
\end{document}

参数规范>{ \SplitArgument{2}{,} } r()表明,有一个r必需的参数,由 分隔(),将由 进行预处理\SplitArgument,它将输入参数拆分2+1为由 分隔的项目,。此命令将转换(0,1,2){0}{1}{2},然后将其传递给\hingeMAIN,它需要带括号的参数并进行绘制。命令;后面的\hinge不是必需的。

在此处输入图片描述

相关内容