我正在尝试从某个点到特定边界创建有角度的线。这是一个简单示例:
\documentclass[margin=2mm]{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\coordinate (A) at (0, 0);
\coordinate (B) at (5, 0);
\coordinate (C) at (5, -5);
\coordinate (D) at (1, -4);
\clip (A) rectangle (C);
\draw (A) -- (B) -- (C);
\foreach \a in {10,30,...,70}{
\draw (D) -- +(\a:3);
}
\end{tikzpicture}
\end{document}
我该如何设置这些线的长度?3 太短了。将值设置为 10 可以解决问题。但是,调整 A、B 和 C 的大小会出现同样的问题。是否可以绘制线条直到它们到达边界?或者我可以在 TikZ 中计算长度吗?我只知道点的计算,但这里我需要一个长度。
答案1
这里建议您计算坐标之间的最大距离。
该函数\MaxNodeDistance
有两个强制参数。第一个参数是参考点。第二个参数可以是定义坐标的列表。该函数的结果是宏\Distance
。
命令\gettikxy
来自https://tex.stackexchange.com/a/33765/5239
为了演示该命令,我将命令更改clip
为draw
并添加角度 45,这是最大距离。
\documentclass[margin=2mm]{standalone}
\usepackage{tikz}
\usepackage{xparse}
\ExplSyntaxOn
\makeatletter
\newcommand{\gettikzxy}[3]{%
\tikz@scan@one@point\pgfutil@firstofone#1\relax
\edef#2{\the\pgf@x}%
\edef#3{\the\pgf@y}%
}
\makeatother
\NewDocumentCommand \MaxNodeDistance { m >{ \SplitList { , } } m }
{
\def\Distance{0pt}
\gettikzxy{(#1)}{\xa}{\ya}
\ProcessList {#2} { \dirk_nodedistance_aux:n }
% \Distance
}
\cs_new:Npn \dirk_nodedistance_aux:n #1
{
\gettikzxy{(#1)}{\xb}{\yb}
\pgfmathparse{max( (veclen(\xa-\xb,\ya-\yb)) ,\Distance }
\edef\Distance{\pgfmathresult pt}
}
\ExplSyntaxOff
\begin{document}
\begin{tikzpicture}
\coordinate (A) at (0, 0);
\coordinate (B) at (5, 0);
\coordinate (C) at (5, -5);
\coordinate (D) at (1, -4);
\draw (A) rectangle (C);
\MaxNodeDistance{D}{A,B,C}
\draw (A) -- (B) -- (C);
\foreach \a in {10,30,45,50,70,90}{
\draw (D) -- +(\a:\Distance);
}
\end{tikzpicture}
\end{document}
答案2
第一个解决方案是,不要使用 3 厘米,而要使用更大的长度,即 10 厘米。您的clip
矩形将在其边界处切割所有线条。
\documentclass[margin=2mm]{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\coordinate (A) at (0, 0);
\coordinate (B) at (5, 0);
\coordinate (C) at (5, -5);
\coordinate (D) at (1, -4);
\clip (A) rectangle (C);
\draw (A) -- (B) -- (C);
\foreach \a in {10,30,...,70}{
\draw (D) -- +(\a:10);
}
\end{tikzpicture}
\end{document}
第二种解决方案:使用intersections
库:
1-加载库:
\usetikzlibrary{intersections}
2-定义哪些路径将相交并name
为它们分配:
\draw[name path=border] (A) -- (B) -- (C);
\path[name path=line] (D)--+(\a:10);
3- 从原点到交点画一条有角度的线:
\draw[name intersections={of=border and line}] (D) -- (intersection-1);
使用此解决方案,您不需要使用路径clip
,但如果您需要不考虑点的边界框,则(\a:10)
必须使用overlay
选项:
\path[name path=line,overlay] (D)--+(\a:10);
完整代码如下:
\documentclass[margin=2mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{intersections}
\begin{tikzpicture}
\coordinate (A) at (0, 0);
\coordinate (B) at (5, 0);
\coordinate (C) at (5, -5);
\coordinate (D) at (1, -4);
% \clip (A) rectangle (C);
\draw[name path=border] (A) -- (B) -- (C);
\foreach \a in {10,30,...,70}{
\path[name path=line,overlay] (D)--+(\a:10);
\draw[name intersections={of=border and line}] (D) -- (intersection-1);
}
\end{tikzpicture}
\end{document}
这两种解决方案都能给你
答案3
我采取了这个解决方案:
\documentclass[margin=2mm]{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\coordinate (A) at (0cm, 0cm);
\coordinate (B) at (5cm, 0cm);
\coordinate (C) at (5cm, -5cm);
\coordinate (D) at (1cm, -4cm);
\newlength\lendiag;
\pgfmathsetlength{\lendiag}{veclen(\linewidth,\linewidth)};
\clip (A) rectangle (C);
\draw (A) -- (B) -- (C);
\foreach \a in {10,30,...,70}{
\draw (D) -- +(\a:(\lendiag););
}
\end{tikzpicture}
\end{document}
在这个最小的例子中,我取了\linewidth
两次,这与给定的点无关。当然,这不是最优的。在我的有效解决方案中,我使用\textwidth
和\textheight
来确定点并计算\lendiag
。所以长度总是足够长。