我使用\tikzset{pics ...
环境定义了一个 tikz 图像,这样我就可以重复并更改几个参数。但是,我希望有一个箭头连接两个图像。我很难做到这一点,因为我不确定如何为箭头可能连接的每个图像创建两个不同的节点。
我有以下内容图像这是由下面的 MWE 创建的。我如何在顶部的两条线之间画一个箭头,并贴上一个标签,上面写着 $\theta$。
\documentclass[tikz]{standalone}
\usepackage{pgfplots}
\usetikzlibrary{arrows,shapes,backgrounds,fit,decorations.pathreplacing,chains,snakes,positioning}
\usepackage{amsmath,amssymb,bm}
\tikzset{
pics/gridd/.style n args={2}{
code = {%
\def \s{0.5}
\def \nx{3}
\def \ny{2}
\def \dx{3}
\def \dy{3}
\def \meshthickness{0.01}
\pgfmathsetmacro \maxposx {\dx*(\nx-1)/2}
\pgfmathsetmacro \maxposy {\dy*(\ny-1)/2}
\draw[line width = 0.2mm] (0, \maxposy) -- (0, \maxposy + 0.8);
\filldraw[black] circle (2pt);
\draw [dashed, line width = 0.2mm] (-\maxposx,\maxposy) -- (\maxposx,\maxposy);
\draw [dashed, line width = 0.2mm] (\maxposx,\maxposy) -- (\maxposx,-\maxposy);
\draw [dashed, line width = 0.2mm] (-\maxposx,-\maxposy) -- (\maxposx,-\maxposy);
\draw [dashed, line width = 0.2mm] (-\maxposx,-\maxposy) -- (-\maxposx,\maxposy);
\draw [dashed, line width = 0.2mm] (0,-\maxposy) -- (0,\maxposy);
\foreach \i in {1,...,\nx}{
\foreach \j in {1,...,\ny}{
\pgfmathsetmacro \x {(\i - (\nx + 1)/2)*\dx}
\pgfmathsetmacro \y {(\j - (\ny + 1)/2)*\dy}
\filldraw[#1, draw=black, line width = 0.2mm] (\x,\y) circle (#2);
}
}
}}}
\begin{document}
\begin{tikzpicture}
\pic {gridd={fill=blue!20!white}{3mm}};
\begin{scope}[rotate around z=20]
\pic {gridd={fill=red!80!white}{3mm}};
\end{scope}
\end{tikzpicture}
\end{document}
答案1
bar
如果您有一个以命名的节点/坐标pic
,并且pic
本身被命名为foo
,那么您可以将该节点引用为foobar
( 的名称pic
加上 节点的名称)。
因为旋转是围绕的中心进行的pic
,所以突出显示垂直线之间的角度可能更容易一些,因为您只需加载angles
和quotes
库,然后使用预定义的即可angle
pic
。
更多解释:
我对代码所做的添加并不多。在代码pic
本身中,我在中心和每个顶点添加了一个坐标:
\filldraw[black] circle (2pt) coordinate (-c);
这里coordinate (-c)
是新的,同样在循环中,
\filldraw[#1, draw=black, line width = 0.2mm] (\x,\y) circle (#2) coordinate (-\i-\j);
coordinate (-\i-\j)
是新的。例如,左下角有一个名为的坐标(-1-1)
,位于 内部pic
。
当使用时pic
,我给它们起了名字,a
并且b
:
\pic (a) {gridd={fill=blue!20!white}{3mm}};
由于pic
的工作方式,这意味着此 左下角的坐标pic
被命名为a-1-1
。
(TikZ 手册第 18 章中提到了这一点,其中pic
描述了 s。)
为了绘制角度本身,我加载了angles
和quotes
库。其中第一个定义了一个,pic
专门用于绘制这样的角度。它被用作pic {angle=<coord 1>--<coord 2>--<coord 3>}
。您需要三个命名坐标,这将pic
绘制它们之间的角度。它在 TikZ 手册第 39 章中有描述(请查看目录下的图书馆部分)。
所以我用的是
\pic ["$\theta$",angle radius=1cm,draw,-stealth] {angle={a-2-2--a-c--b-2-2}};
您会看到,a-2-2
是 的中间、顶部顶点a
pic
,a-c
是 的中心点a
pic
,b-2-2
是 的顶部中间b
pic
。
的使用"<text>"
是库提供的简写形式quotes
,用于向路径添加标签。(此库在第 17.10.4 节中描述引号语法 我认为手册中的最后一个angle radius
部分是不言自明的,最后一部分是指定应该用箭头绘制路径。
\documentclass[tikz]{standalone}
\usepackage{pgfplots}
\usetikzlibrary{arrows,shapes,backgrounds,fit,decorations.pathreplacing,chains,snakes,positioning,angles,quotes}
\usepackage{amsmath,amssymb,bm}
\tikzset{
pics/gridd/.style n args={2}{
code = {%
\def \s{0.5}
\def \nx{3}
\def \ny{2}
\def \dx{3}
\def \dy{3}
\def \meshthickness{0.01}
\pgfmathsetmacro \maxposx {\dx*(\nx-1)/2}
\pgfmathsetmacro \maxposy {\dy*(\ny-1)/2}
\draw[line width = 0.2mm] (0, \maxposy) -- (0, \maxposy + 0.8);
\filldraw[black] circle (2pt) coordinate (-c);
\draw [dashed, line width = 0.2mm] (-\maxposx,\maxposy) -- (\maxposx,\maxposy);
\draw [dashed, line width = 0.2mm] (\maxposx,\maxposy) -- (\maxposx,-\maxposy);
\draw [dashed, line width = 0.2mm] (-\maxposx,-\maxposy) -- (\maxposx,-\maxposy);
\draw [dashed, line width = 0.2mm] (-\maxposx,-\maxposy) -- (-\maxposx,\maxposy);
\draw [dashed, line width = 0.2mm] (0,-\maxposy) -- (0,\maxposy);
\foreach \i in {1,...,\nx}{
\foreach \j in {1,...,\ny}{
\pgfmathsetmacro \x {(\i - (\nx + 1)/2)*\dx}
\pgfmathsetmacro \y {(\j - (\ny + 1)/2)*\dy}
\filldraw[#1, draw=black, line width = 0.2mm] (\x,\y) circle (#2) coordinate (-\i-\j);
}
}
}}}
\begin{document}
\begin{tikzpicture}
\pic (a) {gridd={fill=blue!20!white}{3mm}};
\begin{scope}[rotate around z=20]
\pic (b) {gridd={fill=red!80!white}{3mm}};
\end{scope}
\pic ["$\theta$",angle radius=1cm,draw,-stealth] {angle={a-2-2--a-c--b-2-2}};
\end{tikzpicture}
\end{document}
答案2
另一个选择是 tikz-Euclide。
\documentclass[tikz]{standalone}
\usepackage{pgfplots}
\usetikzlibrary{arrows,shapes,backgrounds,fit,decorations.pathreplacing,chains,snakes,positioning}
\usepackage{amsmath,amssymb,bm}
\usepackage{tkz-euclide} %%% ADDED
\tikzset{
pics/gridd/.style n args={2}{
code = {%
\def \s{0.5}
\def \nx{3}
\def \ny{2}
\def \dx{3}
\def \dy{3}
\def \meshthickness{0.01}
\pgfmathsetmacro \maxposx {\dx*(\nx-1)/2}
\pgfmathsetmacro \maxposy {\dy*(\ny-1)/2}
\draw[line width = 0.2mm] (0, \maxposy) -- (0, \maxposy + 0.8);
\filldraw[black] circle (2pt);
\draw [dashed, line width = 0.2mm] (-\maxposx,\maxposy) -- (\maxposx,\maxposy);
\draw [dashed, line width = 0.2mm] (\maxposx,\maxposy) -- (\maxposx,-\maxposy);
\draw [dashed, line width = 0.2mm] (-\maxposx,-\maxposy) -- (\maxposx,-\maxposy);
\draw [dashed, line width = 0.2mm] (-\maxposx,-\maxposy) -- (-\maxposx,\maxposy);
\draw [dashed, line width = 0.2mm] (0,-\maxposy) -- (0,\maxposy);
\foreach \i in {1,...,\nx}{
\foreach \j in {1,...,\ny}{
\pgfmathsetmacro \x {(\i - (\nx + 1)/2)*\dx}
\pgfmathsetmacro \y {(\j - (\ny + 1)/2)*\dy}
\filldraw[#1, draw=black, line width = 0.2mm] (\x,\y) circle (#2);
}
}
}}}
\begin{document}
\begin{tikzpicture}
\tkzDefPoints{-0.8/2.1/A, 0/2.3/B}; %ADDED
\draw[stealth-stealth] (A) -- (B); % ADDED
\tkzLabelSegment[sloped](A,B) {$\theta$}; %ADDED
\pic {gridd={fill=blue!20!white}{3mm}};
\begin{scope}[rotate around z=20]
\pic {gridd={fill=red!80!white}{3mm}};
\end{scope}
\end{tikzpicture}
\end{document}