TikZ 中长度未知的斜线

TikZ 中长度未知的斜线

我正在尝试从某个点到特定边界创建有角度的线。这是一个简单示例:

\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

为了演示该命令,我将命令更改clipdraw并添加角度 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。所以长度总是足够长。

相关内容