在下面的图片中,我想要画一条水平线到横坐标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}