TikZ 中两条延长线的交点无需绘制

TikZ 中两条延长线的交点无需绘制

这个问题是TikZ:如何找到两条延长线的交点?

我有一个中等复杂的 TikZ 图形,显示光学系统的设置。我需要计算两条延长线的交点,这两条延长线分别通过 (A)-(B) 和 (C)-(D)。

\def我一开始有几个可以修改的参数,以改变光学的一些参数。这些参数显然也会改变四个点的相对位置。我链接的问题中提出的解决方案对我来说并不完美,因为我无法先验地知道我应该在命令\def中使用多长,我也无法做到,这会创建一条巨大的线,即使没有画出来。calc$(A)!length!(B)$\path [name path=AB] (A) -- ($(B)!-100cm!(A)$);

我理想的解决方案是类似于 Count-Zero 提出的使用包的解决方案,但是对于我来说使用起来相当困难,因为由于包缺少英文文档,tkz-euclide我无法翻译我的整个绘图风格...tkz-euclide

答案1

TikZ 有一个尚未记录的intersection坐标系统,可以隐式地用作

(intersection of <c11>--<c12> and <c21>--<c22>)

(<c11>)它可以找到从到 的一条线与从到(<c12>)的一条线的交点,即使这个交点不位于这两点之间的线段上。(<c21>)(<c22>)

因此,就你的情况而言,你只需要做

(intersection of A--B and C--D)

然后它将返回所需的点。(如果这些线平行或几乎平行,则会抛出错误,因为交点太远。)

坐标系intersection仅取四个给定点并求解两条线(而不是线段)的线性方程组。

从快速视图的定义来看,也只做\tkzInterLL数学tkz-euclide


公平地说,该intersections库也只进行数学运算,但当然适用于任意路径,但只返回实际位于路径上的点。

我将使用该intersections库添加另一个解决方案,其中路径是通过在两个方向上延伸约 37 厘米(适合 A4 纸的最大距离)的线来构建的,然后像往常一样简单地找到交点。

该选项overlay意味着路径不会影响边界框。path only确保没有继承的选项会使路径可见。

代码(交叉口 cs)

\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}[nodes={circle, minimum size=+4pt, inner sep=+0pt, draw}]
\pgfmathsetseed{309382}
\path (rand-5, 3*rand) node (A) [label=A] {}
      (rand-3, 3*rand) node (B) [label=B] {}
      (rand+2, 3*rand) node (C) [label=C] {}
      (rand+4, 3*rand) node (D) [label=D] {};
\draw (A)--(B) (C)--(D);
\path[red] node (E) at (intersection of A--B and C--D) [label=E] {};
\end{tikzpicture}
\end{document}

代码(交叉口库)

\documentclass[tikz]{standalone}
\usetikzlibrary{intersections,calc}
\tikzset{
  intersection of/.code args={#1--#2 and #3--#4}{
    \path[overlay,path only,name path=@a]($(#1)!-37cm!(#2)$)--($(#2)!-37cm!(#1)$);
    \path[overlay,path only,name path=@b]($(#3)!-37cm!(#4)$)--($(#4)!-37cm!(#3)$);
    \tikzset{name intersections={of=@a and @b}}}}
\begin{document}
\begin{tikzpicture}[nodes={circle, minimum size=+4pt, inner sep=+0pt, draw}]
\pgfmathsetseed{309382}
\path (rand-5, 3*rand) node (A) [label=A] {}
      (rand-3, 3*rand) node (B) [label=B] {}
      (rand+2, 3*rand) node (C) [label=C] {}
      (rand+4, 3*rand) node (D) [label=D] {};
\draw (A)--(B) (C)--(D);
\tikzset{intersection of=A--B and C--D}
\path[red] node (E) at (intersection-1) [label=E] {};
\end{tikzpicture}
\end{document}

输出

在此处输入图片描述

相关内容