tikz 命名路径的交点

tikz 命名路径的交点

我想使用命名路径来计算两条线的交点。但下面的示例代码不起作用!

\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

P1path和 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

在您的特定情况下,问题在于路径P1P2不相交,因为它们太短了。您可以使用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}

在此处输入图片描述

相关内容