我正在尝试在 TikZ 中单线绘制三个全等的等边三角形(见下图)。从本质上讲,这相当简单,但我想编写 TikZ 代码,以便通过调整一些几何参数轻松更改图形的形状。更具体地说,我希望 TikZ 图形中的坐标根据参数的值而变化。
我想要改变的两个参数是距离A到问(以下简称大号)以及问到b(以下简称Δ) 中。通过选择A作为原点,坐标表达式如下
A:( 0 , 0 )
b:( cos(60°)*(L + Δ) , sin(60°)*(L + Δ) )
C:( bx + cos(60°)*L , by - sin(60°)*L )
d:( L - cx , cy )
埃:( L - bx, by )
F:( L , 0 )
在哪里繁體,经过,陣容和赛表示X和是点坐标b和C分别。(坐标问对于绘制该图来说并不是必需的。
我尝试了以下方法,但这给出了如下所示的输出,其中只有A和F是正确的。如果这个方法有效,我就可以简单地改变和的定义\l
并\delta
重新编译,看看几何形状如何随着大号和Δ。
\begin{tikzpicture}
\def\cossixty{0.5}
\def\sinsixty{0.866025}
\def\l{6}
\def\delta{2}
\def\ldelta{\l+\delta}
\def\bx{\cossixty*\ldelta}
\def\by{\sinsixty*\ldelta}
\def\cx{\bx+\cossixty*\l}
\def\cy{\by-\sinsixty*\l}
\def\dx{\l-\cx}
\def\ex{\l-\bx}
\coordinate (a) at (0,0);
\coordinate (b) at (\bx,\by);
\coordinate (c) at (\cx,\cy);
\coordinate (d) at (\dx,\cy);
\coordinate (e) at (\ex,\by);
\coordinate (f) at (\l,0);
\begin{scope}[thick]
\draw (a) -- (b) -- (c) -- (d) -- (e) -- (f) -- (a);
\end{scope}
\end{tikzpicture}
所以我的问题是:如何让 TikZ 将上面列出的坐标表达式计算为浮点数并得到正确的输出?
(这只是我在 TikZ 中制作的较大图像的一小部分,因此,当然,我选择以单线绘制图形并使用可调整的参数是有充分理由的。)
答案1
一旦让它pgf
帮你计算,你的代码就可以正常工作:
笔记:
\delta
是希腊字母,因此最好使用不同的名称。- 我还添加了
node
来标记这两个参数。
代码:
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\def\l{4}
\def\MyDelta{2}
\pgfmathsetmacro\ldelta{\l+\MyDelta}
\pgfmathsetmacro\bx{cos(60)*\ldelta}
\pgfmathsetmacro\by{sin(60)*\ldelta}
\pgfmathsetmacro\cx{\bx+cos(60)*\l}
\pgfmathsetmacro\cy{\by-sin(60)*\l}
\pgfmathsetmacro\dx{\l-\cx}
\pgfmathsetmacro\ex{\l-\bx}
\coordinate (a) at (0,0);
\coordinate (b) at (\bx,\by);
\coordinate (c) at (\cx,\cy);
\coordinate (d) at (\dx,\cy);
\coordinate (e) at (\ex,\by);
\coordinate (f) at (\l,0);
\begin{scope}[thick]
\draw (a) -- (b) -- (c) -- (d) -- (e) -- (f) -- (a)
node [below, midway] {$l = \l, \Delta = \MyDelta$};
\end{scope}
\end{tikzpicture}
\end{document}
答案2
就是图个好玩儿:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{shapes.geometric}
\begin{document}
\begin{tikzpicture}
\def\qadist{3cm}
\def\qbshift{1cm}
\pgfmathsetmacro{\myheight}{\qadist/sin(60)}
\tikzset{equilatri/.style={regular polygon,regular polygon sides=3,
draw, anchor=corner 2,minimum height=\myheight
}
}
\node[equilatri] (a) {};
\node[equilatri] at ([shift={(60:\qbshift)}]a.corner 2) (b) {};
\node[equilatri] at ([shift={(120:\qbshift)}]a.corner 2) (c) {};
\end{tikzpicture}
\end{document}
输出相同,但更紧凑一些
\begin{tikzpicture}
\def\l{3}
\def\d{1}
\draw (0,0) -- (60:\l+\d) -- ++(-60:\l) -- ++({-(\l+\d)},0) -- ++(60:\l) -- ++(-60:\l+\d) -- cycle;
\end{tikzpicture}
答案3
还有其他几种方法可以计算坐标。可以在没有定义变量的情况下进行计算。为了获得最终的图片,我更喜欢避免使用节点,因为如果混合绘图和文本,则很难缩放整个图片。唯一的问题是命名图片中使用的点。
A)第一个想法:我们创建一个宏来构建一个等边三角形。第二个参数用于放置新三角形。它是\Delta
一个角度。第一个参数是边的长度。所有坐标都是 a、b 和 c。我过去常常\pgfnodealias
重命名坐标。
\documentclass{article}
\usepackage{tikz}
\newcommand\equi[2]{%
\begin{scope}[shift={(#2)}]
\draw (0,0) coordinate (a)
-- (0:#1) coordinate (b)
-- (60:#1) coordinate (c)--cycle;
\end{scope}
}
\begin{tikzpicture}
\equi{6}{0:0} \node[below] at (a){a} ;
\equi{6}{60:2}
\pgfnodealias{e}{a}
\node[below right] at (e){e} ;
\equi{6}{120:2}
\end{tikzpicture}
\end{document}
B) 它类似于 percusse 的解决方案,但我使用宏。
\documentclass{article}
\usepackage{tikz}
\newcommand\equilatri[2]{%
\draw (0,0) -- (60:#1+#2)
-- ++(-60:#1)
-- ++(0:-#1-#2)
-- ++(60:#1)
-- ++(-60:#1+#2)
-- cycle;
\node [below] at (0:#1/2) {$l = #1, \Delta = #2$};
}
\begin{document}
\begin{tikzpicture}
\begin{scope}[thick,red]
\equilatri{4}{2}
\end{scope}
\begin{scope}[thick,xshift=6cm,blue]
\equilatri{6}{1}
\end{scope}
\end{tikzpicture}
\end{document}