我正在绘制三角形的内切圆。这些图包括三角形每条边的垂直平分线,显示平分线相交的点也是外接圆的半径。目标是制作一个装饰图案,所以我想用随机生成的三角形重复图像。这是三角形的代码。对于循环的每次迭代,我将当前圆的中心向右移动,随机获取 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}