TikZ:如何在不知道起点的情况下绘制一条到给定横坐标的水平线?

TikZ:如何在不知道起点的情况下绘制一条到给定横坐标的水平线?

在下面的图片中,我想要画一条水平线到横坐标x=3
如何才能轻松地做到这一点,而无需明确定义换行点(即“ --++(45:.5)”点)?

在此处输入图片描述

以下是我知道的可能的解决方案,但它们并不令人满意(因为太复杂):

  • 我可以使用intersections库和垂直线定义一个交点(3,-10) -- (3,10),但这似乎有点过度,并且会弄乱边界框(我可以添加一个\clip...但这会使代码变得更加庞大);
  • 我可以绘制一条线\draw (45:.75) ++ (45:.5) -| ++(2,0);,然后使用 定义角度处的新坐标[pos=.5]。但同样,这似乎太费事了。

\documentclass[border=10pt]{standalone}
    \usepackage{tikz}
\begin{document}
    \begin{tikzpicture}
        \fill [gray] (0,0) circle [radius=1];
        \draw [<-] (45:.75) -- ++ (45:.5) -- ++(2,0);

        %== below are just 'decoration' to make the picture more obvious ==%
        \draw [help lines] (-1.5,-1.5) grid (3.5,1.5);
        \path [font=\tiny, text=blue] (45:.75) node [left]{\verb|\path (45:.75)|}
            -- ++ (45:.5) node [above] {\verb|-- ++ (45:.5)|}
            -- ++(2,0) node [above] {\verb|-- ++(2,0);|};
        \foreach \x in {-1, ..., 3}{
            \node [below] at (\x,0) {\x};
        }
    \end{tikzpicture}
\end{document}

答案1

基本思想是使用A -| B运算符计算位于 横坐标B和 坐标 上的点的位置A。(请注意,您可以使用A |- B来执行相反的操作。)

因此您可以使用以下任一解决方案:

\draw [<-] (45:.75) -- ++ (45:.5) coordinate (a) -- (a-| {(3,0)});
% OR %
\usetikzlibrary{calc}
\draw [<-] (45:.75) -- ++ (45:.5) -- ({$(45:.75) + (45:.5)$} -| {(3,0)});

第一个函数在箭头断开的位置动态创建一个局部坐标(a)。第二个函数重新计算角度的位置(即起点坐标 + 移到角度点的坐标)。


如果您计划经常这样做,您可以创建一个宏来完成所有工作。

\documentclass[border=10pt]{standalone}
    \usepackage{tikz}
        \usetikzlibrary{calc}

\newcommand{\angled}[3][]% #1=draw options (optional), #2=start, #3=end, use tikz point notation inside braces
{\bgroup% local macros
  \path #2;
  \pgfgetlastxy{\xa}{\ya}%
  \path #3;
  \pgfgetlastxy{\xb}{\yb}%
  \pgfmathsetlengthmacro{\xc}{\xb+.707*(\ya-\yb)}%
  \pgfmathsetlengthmacro{\xd}{\xb+.707*(\yb-\ya)}%
  \ifdim \ya>\yb \relax
    \ifdim \xa<\xb \relax \let\xc=\xd \fi
  \else
    \ifdim \xa>\xb \relax \let\xc=\xd \fi
  \fi
  \draw[#1] #2 -- (\xc,\ya) -- #3;
\egroup}

\begin{document}
    \begin{tikzpicture}
        \fill [gray] (0,0) circle [radius=1];
        %\draw [<-] (45:.75) -- ++ (45:.5) -- ++(2,0);
        \angled[->]{(2,1)}{(45:.75)}%

        %== below are just 'decoration' to make the picture more obvious ==%
        \draw [help lines] (-1.5,-1.5) grid (3.5,1.5);
        \path [font=\tiny, text=blue] (45:.75) node [left]{\verb|\path (45:.75)|}
            -- ++ (45:.5) node [above] {\verb|-- ++ (45:.5)|}
            -- ++(2,0) node [above] {\verb|-- ++(2,0);|};
        \foreach \x in {-1, ..., 3}{
            \node [below] at (\x,0) {\x};
        }
    \end{tikzpicture}
\end{document}

相关内容