使用 veclen 比率作为缩放因子的问题

使用 veclen 比率作为缩放因子的问题

我正在绘制三角形的内切圆。这些图包括三角形每条边的垂直平分线,显示平分线相交的点也是外接圆的半径。目标是制作一个装饰图案,所以我想用随机生成的三角形重复图像。这是三角形的代码。对于循环的每次迭代,我将当前圆的中心向右移动,随机获取 3 个角度,我用它们绘制 3 个顶点 a、b 和 c,它们都位于半径为 1 的圆上(最后一行也会绘制)。

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc,intersections,through,backgrounds}

\begin{document}
\begin{tikzpicture}[scale=1,trim left=3cm]
\foreach \i in {0.0,1.0,...,6.0} {
  \begin{scope}
  \def\thetaA{rnd*120};
  \def\thetaB{120+rnd*120};
  \def\thetaC{240+rnd*120};
  \coordinate (center) at (4.3*\i,0.0);
  \coordinate (a) at ($(center)+ (\thetaA:1.0)$);
  \coordinate (b) at ($(center) + (\thetaB:1.0)$);
  \coordinate (c) at ($(center) + (\thetaC:1.0)$);
  \draw (a)--(b)--(c)--(a);
  \draw[name path=circumcircle] (center) circle (1);

要绘制一条边的垂直平分线,我只想将线段从圆心延伸到边的中点,长度要足够长,刚好超出圆的周长。但是,因为我随机生成三角形,所以没有一个适合所有情况的因素。

作为第一步,我尝试绘制一个通过一条边 AB 的中点的圆的半径。作为缩放因子,我认为我可以使用圆的半径与从中心到中点的距离的比率,两者都使用 veclen 计算。以下是代码:

  \coordinate (midpointOfAB) at ($(a)!.5!(b)$);
  \coordinate (midpointOfBC) at ($(b)!.5!(c)$);
  \coordinate (midpointOfAC) at ($(a)!.5!(c)$);
  \draw[name path=toAB,blue] let
  \p1 = ($ (midpointOfAB) - (center)$),
  \p2 = ($ (a) - (center)$),
  \n1 = {veclen(\x1,\y1)},
  \n2 = {veclen(\x2,\y2)}
  in 
  (center) -- ($(center)!\n2/\n1!(midpointOfAB)$);

从中心开始的线段正在朝正确的方向(朝向 AB 的中点)绘制。但是,长度却相差甚远。一般来说,这些线段的长度都比圆的周长短。如果 n1 是中心到 AB 中点的距离,n2 是圆的半径,那么 n2/n1 应该是将线段延伸到圆周的因数(x*n1 = n2),对吗?我遗漏了什么?任何见解都将不胜感激!

答案1

veclen在 中给出一个长度pt,并且可能\n2/\n1也变成 中的长度pt,因此您得到的是“距离修饰符”而不是“部分修饰符”(使用手册中的术语)。要删除后缀pt,请使用scalar(veclen(..))。然后它就可以正常工作了。

另一方面,如果使用\pgfmathsetmacro而不是\def来定义\thetaA等,意味着rnd在宏定义时进行评估,您只需使用例如 即可\draw [blue] (center) -- ++({(\thetaA+\thetaB)/2}:1);

(创建的图像中圆圈之间的间距比代码中给出的要小。)

在此处输入图片描述

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc,intersections,through,backgrounds}

\begin{document}
\begin{tikzpicture}[scale=1,trim left=3cm]
\foreach \i in {0.0,1.0,...,6.0} {
  \begin{scope}
  \def\thetaA{rnd*120};
  \def\thetaB{120+rnd*120};
  \def\thetaC{240+rnd*120};
  \coordinate (center) at (4.3*\i,0.0);
  \coordinate (a) at ($(center)+ (\thetaA:1.0)$);
  \coordinate (b) at ($(center) + (\thetaB:1.0)$);
  \coordinate (c) at ($(center) + (\thetaC:1.0)$);
  \draw (a)--(b)--(c)--(a);
  \draw[name path=circumcircle] (center) circle (1);

  \coordinate (midpointOfAB) at ($(a)!.5!(b)$);
  \coordinate (midpointOfBC) at ($(b)!.5!(c)$);
  \coordinate (midpointOfAC) at ($(a)!.5!(c)$);
  \draw[name path=toAB,blue] let
  \p1 = ($ (midpointOfAB) - (center)$),
  \p2 = ($ (a) - (center)$),
  \n1 = {scalar(veclen(\x1,\y1))},
  \n2 = {scalar(veclen(\x2,\y2))}
  in 
  (center) -- ($(center)!\n2/\n1!(midpointOfAB)$);
\end{scope}
}

\end{tikzpicture}
\begin{tikzpicture}[scale=1,trim left=3cm]
\foreach \i in {0.0,1.0,...,6.0} {
  \begin{scope}
  \pgfmathsetmacro\thetaA{rnd*120} % rnd evaluated here
  \pgfmathsetmacro\thetaB{120+rnd*120}
  \pgfmathsetmacro\thetaC{240+rnd*120}
  \coordinate (center) at (4.3*\i,0.0);
  \coordinate (a) at ($(center)+ (\thetaA:1.0)$);
  \coordinate (b) at ($(center) + (\thetaB:1.0)$);
  \coordinate (c) at ($(center) + (\thetaC:1.0)$);
  \draw (a)--(b)--(c)--(a);
  \draw[name path=circumcircle] (center) circle (1);

  \draw [blue] (center) -- ++({(\thetaA+\thetaB)/2}:1);
\end{scope}
}
\end{tikzpicture}
\end{document}

相关内容