使用相对坐标和 tikz 绘制圆弧

使用相对坐标和 tikz 绘制圆弧

我的问题可能很愚蠢,但请考虑一下我对 Tikz 还很陌生。

我正在尝试使用以下代码绘制类似于艾菲尔的塔

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{shapes.geometric}
\usetikzlibrary{shapes.misc}

\begin{document}

\begin{tikzpicture}[{x=(1mm,0)},{y=(0,1mm)}]
\def\towerwd{5}                 % tower width
\def\towerht{10}                % tower height
\def\towerar{4*\towerwd/10}     % tower arc radius

\def\tower#1{% #1=position
    \draw[thick]
        %... tower arc
        {#1++(-\towerar,0)}
            arc(180:0:\towerar)--
            (\towerwd/2,0) to[out=120,in=270]
            (0,\towerht) to[out=270,in=60]
            (-\towerwd/2,0)--
            cycle
        ;
    }

\tower{(0,0)} % this works!
\tower{(0,20)} % this is messy!
\end{tikzpicture}

\end{document}

当我这样做时它工作正常\tower{(0,0)},但当我使用任何其他坐标时变得混乱。我在这里做错了什么?

答案1

++由于没有添加这些坐标,所以会变得混乱,您可能会使用calc如果没有(IMHO)更优雅的方式pic年代。

s 做什么pic?顾名思义,pic 是一张像塔一样的小图片。spic可以放置和变换。我所做的就是将您的\tower代码移动到 a 的定义中,pic方法是

 \tikzset{pics/.cd,
    tower/.style={code={
        \draw[thick]
            (-\towerar,0)
                arc(180:0:\towerar)--
                (\towerwd/2,0) to[out=120,in=270]
                (0,\towerht) to[out=270,in=60]
                (-\towerwd/2,0)--
                cycle
            ;
    }}}

这里,.cd切换到picspgfkeystikz目录的子目录。剩下的只是教 TiZ 塔代码。

\documentclass{article}
\usepackage{tikz}

\begin{document}
\tikzset{pics/.cd,
tower/.style={code={
    \draw[thick]
        (-\towerar,0)
            arc(180:0:\towerar)--
            (\towerwd/2,0) to[out=120,in=270]
            (0,\towerht) to[out=270,in=60]
            (-\towerwd/2,0)--
            cycle
        ;
}}}

\begin{tikzpicture}[{x=(1mm,0)},{y=(0,1mm)}]
\def\towerwd{5}                 % tower width
\def\towerht{10}                % tower height
\def\towerar{4*\towerwd/10}     % tower arc radius
\path (0,0) pic{tower} (0,20) pic{tower};
\end{tikzpicture}

\end{document}

在此处输入图片描述

但这个例子根本不能解释为什么人们对 pics 如此感兴趣。相反,你可能想添加参数,而不是使用有些笨拙的\def\towerwd{5}等等语句。你可能想从“外部”更改参数。所有这些都可以用pics 来完成。

\documentclass{article}
\usepackage{tikz}

\begin{document}
\tikzset{pics/.cd,
tower/.style args={#1 wide and #2 high}{code={
    \draw[thick]
        (-4*#1/10,0)
            arc(180:0:4*#1/10)--
            (#1/2,0) to[out=120,in=270]
            (0,#2) to[out=270,in=60]
            (-#1/2,0)--
            cycle
        ;
}}}

\begin{tikzpicture}[{x=(1mm,0)},{y=(0,1mm)}]
\path (0,0) pic{tower=5 wide and 15 high}
node[below]{Paris} (20,2) pic[rotate=-30,blue]{tower=5 wide and 10 high}
node[below]{Pisa};
\end{tikzpicture}

\end{document}

在此处输入图片描述

相关内容