这个问题是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}