我有两个节点 (A) 和 (B),我想只绘制它们之间直线的中心段,长度为给定的某个值(比如 2cm,但会有所不同)。有什么方法可以做到这一点?我保证 (A) 和 (B) 之间的距离至少为 2cm。
我知道缩短 < 和缩短 >,但问题是我不知道要缩短的确切数量,而且我不想每次都自己计算。
答案1
我没有仔细看问题,以为你想画出任何路径。所以我创建了一个(元)装饰来实现这一点。对于直线,这里给出的其他解决方案当然要简单得多。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{decorations}
% A simple empty decoration, that is used to ignore the last bit of the path
\pgfdeclaredecoration{ignore}{final}
{
\state{final}{}
}
% Declare the actual decoration.
\pgfdeclaremetadecoration{middle}{initial}{
\state{initial}[
width={(\pgfmetadecoratedpathlength - \the\pgfdecorationsegmentlength)/2},
next state=middle
]
{\decoration{moveto}}
\state{middle}[
width={\the\pgfdecorationsegmentlength},
next state=final
]
{\decoration{curveto}}
\state{final}
{\decoration{ignore}}
}
% Create a key for easy access to the decoration (as suggested by Jake).
\tikzset{middle segment/.style={decoration={middle},decorate, segment length=#1}}
\begin{document}
\begin{tikzpicture}[radius=2pt]
\fill (0,0) circle;
\fill (4,0) circle;
\draw[middle segment=2cm,double,red,->] (0,0) to[out=30,in=150] (4,0);
\end{tikzpicture}
\end{document}
答案2
图书馆calc
把这种东西当早餐吃。
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
\node (a) at (0,0) {A};
\node (b) at (3,3) {B};
\draw ($($(a)!.5!(b)$)!1cm!(a)$) -- ($($(a)!.5!(b)$)!1cm!(b)$);
\end{tikzpicture}
\end{document}
语法如下:$...$
被解释为“坐标计算”,它返回一个坐标。我们从 开始,$(a)!.5!(b)$
它位于(a)
和 的中间(b)
。然后我们1cm
从这个点向移动(a)
。这是我们的起点。我们从那里画一条线到 ,但用(b)
代替(a)
。
结果:
答案3
与其他答案类似,但也使用交叉点库。
\documentclass{minimal}
\usepackage{tikz}
\usetikzlibrary{calc}
\usetikzlibrary{intersections}
\begin{document}
\begin{tikzpicture}
\pgfmathsetmacro{\length}{2}
\coordinate (A) at (0,0) ;
\coordinate (B) at (4,4);
\coordinate (mid) at ($(A)!0.5!(B)$);
\path[name path=line,draw=lightgray] (A) node[left] {$A$} -- (B) node[right] {$B$};
\path[name path=circle,draw=lightgray] (mid) circle[radius=0.5*\length];
\draw [red, blue,ultra thick, name intersections={of=line and circle}]
(intersection-1) -- (intersection-2);
\end{tikzpicture}
\end{document}
输出为
蓝色段的长度由宏的值决定\length
。
另一种选择是剪辑路径:
\begin{tikzpicture}
\pgfmathsetmacro{\length}{2}
\coordinate[label=left:$A$] (A) at (0,0) ;
\coordinate[label=right:$B$] (B) at (4,4);
\coordinate (mid) at ($(A)!0.5!(B)$);
\begin{scope}
\clip (mid) circle[radius=0.5*\length];
\draw[blue,ultra thick] (A) -- (B);
\end{scope}
\end{tikzpicture}
答案4
那个怎么样?
\documentclass{minimal}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
% def Points
\fill (0,0) coordinate (A) circle (1pt) (5,2) coordinate (B) circle (1pt);
% two nodes A and B
\node [below] at (A) {Node A};
\node [above] at (B) {Node B};
% line between
\draw ($(A)!1cm!(B)$) -- ($(A)!3cm!(B)$);
\end{tikzpicture}
\end{document}
首先,我定义两个坐标,绘制它们并添加两个节点。我使用语法⟨p⟩!⟨factor/dimension⟩!⟨q⟩
来获取 A 和 B 之间的指定点
。不幸的是,在我的解决方案中,您必须使用两个一角硬币才能获得定义的长度。在这种情况下,3cm - 1cm = 2cm 段长度。
请参阅 PGF 手册,欧几里得教程中的“4.2.1 使用部分计算来构造 D”一节