我想使用命名路径来计算两条线的交点。但下面的示例代码不起作用!
\documentclass[border=1mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{intersections}
\begin{document}
\begin{tikzpicture}
\tikzset{
dot/.style={circle,inner sep=1pt,fill,label={\tiny #1},name=#1},
}
\node[dot=A] (A) at (0,0) {};
\node[dot=B] (B) at (1,0) {};
\node[dot=C] (C) at (0,1) {};
\node[dot=D] (D) at (1,0.5) {};
\path[name path=P1] (A) -- (B);
\path[name path=P2] (C) -- (D);
\coordinate (CS) at (intersection of P1 and P2);
%\coordinate (CS) at (intersection of A--B and C--D);
\draw (A) -- (B);
\draw (C) -- (D);
\node[dot=E] (E) at (CS) {};
\draw[dotted] (B)--(E)--(D);
\end{tikzpicture}
\end{document}
如果我使用如下注释行:
\coordinate (CS) at (intersection of A--B and C--D);
运行正常。是否可以使用命名路径作为交集宏的参数!
答案1
对于真实的交叉点,你可以这样写(我改变了 D 的坐标)
\begin{tikzpicture}
\tikzset{dot/.style={circle,inner sep=1pt,fill,label={\tiny #1},name=#1}}
\node[dot=A] (A) at (0,0) {};
\node[dot=B] (B) at (1,0) {};
\node[dot=C] (C) at (0,1) {};
\node[dot=D] (D) at (1,-0.5) {};
\draw [name path=P1] (A) -- (B);
\draw [name path=P2] (C) -- (D);
\path [name intersections={of=P1 and P2,by=E}];
\node[dot=E] at (E) {};
\draw[dotted] (B)--(E)--(D);
\end{tikzpicture}
别的
\begin{tikzpicture}
\tikzset{
dot/.style={circle,inner sep=1pt,fill,label={\tiny #1},name=#1}}
\node[dot=A] (A) at (0,0) {};
\node[dot=B] (B) at (1,0) {};
\node[dot=C] (C) at (0,1) {};
\node[dot=D] (D) at (1,0.5) {};
\draw [name path=A--B] (A) -- (B);
\draw [name path=C--D] (C) -- (D);
\coordinate (E) at (intersection of A--B and C--D);
\node[dot=E] at (E) {};
\draw[dotted] (B)--(E)--(D);
\end{tikzpicture}
答案2
P1
path和 path之间必须有实际的交点P2
。你可以使用类似
\path[name path=P1,overlay] (A) -- (B)--([turn]0:5cm);
\path[name path=P2,overlay] (C) -- (D)--([turn]0:5cm);
放大路径而不扩大图片的边界框。
然后你可以使用
\path [name intersections={of=P1 and P2,by={CS}}];
定义CS
扩大路径P1
和交叉点处的坐标P2
。
代码:
\documentclass[border=1mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{intersections}
\begin{document}
\begin{tikzpicture}
\tikzset{
dot/.style={circle,inner sep=1pt,fill,label={\tiny #1},name=#1},
}
\node[dot=A] (A) at (0,0) {};
\node[dot=B] (B) at (1,0) {};
\node[dot=C] (C) at (0,1) {};
\node[dot=D] (D) at (1,0.5) {};
\path[name path=P1,overlay] (A) -- (B)--([turn]0:5cm);
\path[name path=P2,overlay] (C) -- (D)--([turn]0:5cm);
\path [name intersections={of=P1 and P2,by={CS}}];
\draw (A) -- (B);
\draw (C) -- (D);
\node[dot=E] (E) at (CS) {};
\draw[dotted] (B)--(E)--(D);
\end{tikzpicture}
\end{document}
答案3
符号intersection of A--B and C--D
很旧并且未出现在TikZ 3.0
文档中。
新的intersections
库记录在“13.3.2 任意路径的交点”一节中,其中解释了如何使用named paths
。
在您的特定情况下,问题在于路径P1
和P2
不相交,因为它们太短了。您可以使用calc
库帮助和语法将它们加长,这些语法在“13.15.3 部分路径修饰符的语法”中进行了解释,该语法定义了两个坐标之间的线上的点,但不一定位于两者之间。
\documentclass[border=1mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{intersections,calc}
\begin{document}
\begin{tikzpicture}
\tikzset{
dot/.style={circle,inner sep=1pt,fill,label={\tiny #1},name=#1},
}
\node[dot=A] (A) at (0,0) {};
\node[dot=B] (B) at (1,0) {};
\node[dot=C] (C) at (0,1) {};
\node[dot=D] (D) at (1,0.5) {};
\path[name path=P1] (A) -- ($(A)!3!(B)$);
\path[name path=P2] (C) -- ($(C)!3!(D)$);
\path [name intersections={of=P1 and P2, by={E}}];
\draw (A) -- (B);
\draw (C) -- (D);
\node[dot=E] at (E) {};
\draw[dotted] (B)--(E)--(D);
\end{tikzpicture}
\end{document}