我正在尝试绘制两个以任意点为原点的圆弧扇区。我觉得我在这里遗漏了一些东西,因为这应该可行,但是,正如您在下图中看到的那样,红色圆弧集中在 +90 度,而不是面向黑点:
我正在做的是(下面的MWE):
- 如果我想从红点到黑点画三条圆弧,我使用宏
\ExtractCoordinate
来获取黑点的坐标。 - 然后,我使用
tikzmath
和atan2
来获取红点和黑点之间的角度。由于我在范围内,我不需要红点坐标,因为它在范围内定义为 (0,0) <- (!) 我觉得错误可能出在这里。 - 最后,我绘制了三个具有不同半径的参数化圆弧。
正如您在图片中看到的,此过程适用于黑色 -> 红色之间的弧线,但不适用于红色 -> 黑色之间的弧线。我在这里遗漏了什么?
先感谢您!
梅威瑟:
\documentclass[tikz,border=5mm]{standalone}
\usetikzlibrary{positioning,calc,math}
\tikzstyle{help lines}=[thin,gray!40]
%
\newdimen\XCoord
\newdimen\YCoord
\newcommand*{\ExtractCoordinate}[1]{\path (#1); \pgfgetlastxy{\XCoord}{\YCoord};}%
%
\begin{document}
\begin{tikzpicture}
%\draw[help lines,step=1] (-3,-3) grid (3,3);
\coordinate (Origin) at (0,0);
%- Red
\begin{scope}[thick,color=red,shift={(-2,0.5)}]
\coordinate (Tag 1) at (0,0);
\draw[fill] (Tag 1) circle (4pt) node[above,yshift=0.1cm] {Tag 1};
\ExtractCoordinate{$(Origin)$};
\tikzmath{
\middleAng = atan2(\YCoord,\XCoord);
}
\foreach \y in {0.5,0.75,1}
\draw[domain=\middleAng-15:\middleAng+15] plot ({\y*cos(\x)}, {\y*sin(\x)});
\end{scope}
\ExtractCoordinate{$(Tag 1)$};
\tikzmath{
\middleAng = atan2(\YCoord,\XCoord);
}
\foreach \y in {0.5,0.75,1}
\draw[thick,domain=\middleAng-15:\middleAng+15] plot ({\y*cos(\x)}, {\y*sin(\x)});
\draw[fill] (Origin) circle (4pt) node[right,xshift=0.1cm] {Reader};
\end{tikzpicture}
\end{document}
答案1
你可以尝试expanding waves
装饰
\documentclass[tikz,border=5mm]{standalone}
\usetikzlibrary{calc, decorations.pathreplacing}
%
\begin{document}
\begin{tikzpicture}[mywaves/.style={decoration={expanding waves, angle=15, segment length=2mm}, decorate, thick}]
\fill[red] (-2,0.5) coordinate[label=Tag1] (Tag1) circle (4pt);
\fill[black] (0,0) coordinate[label=right:Reader] (Origin) circle (4pt);
\draw[mywaves] (Origin)--($(Origin)!.5!(Tag1)$);
\draw[mywaves, red] (Tag1)--($(Origin)!.5!(Tag1)$);
\end{tikzpicture}
\end{document}
答案2
我认为 Ignasi 为您提供了最佳解决方案——为什么要重新发明膨胀波轮?——但我确实发现弄清楚为什么应该起作用的东西没有起作用很有趣。所以这是关于出了什么问题,而不是如何最好地修复它。
您认为问题出在范围上,这是正确的。问题在于范围定义的变换干扰了您的坐标计算。
从本质上讲,据我所知,您在那时试图做的是说“我有两个坐标 - 比如a
和b
- 并且我想从 构建一个 的点。” 没有任何范围,这很简单,因为它b
在。a
($(b)-(a)$)
但是,当你将变换放入图片中时,事情就会变得有点混乱。坐标被放置在特定点,然后它们被烘焙并且不受局部变换的影响。也就是说,\draw (a) -- (b);
无论什么变换有效,都会产生相同的路径,因为当 TikZ 看到(a)
并(b)
关闭变换时,它会解析它们以找出它们的位置。但是一旦 TikZ 找出它们的位置,($(a)-(b)$)
它们就会被输入后退进入解析器,现在 TikZ 忘记了它们最初来自坐标,因此应用任何局部变换。
这很有趣,因为有各种错误答案感觉它们应该有效:
原文
\ExtractCoordinate{$(Origin)$}
产生该点是(0pt,0pt)
因为那是(Origin)
在主坐标系中的位置。差异(如果不在本地范围的原点,则
\ExtractCoordinate{$(Origin)-(Tag 1)$}
必须执行此操作)也会失败。尽管可以正确解析,但它随后会因转换而发生偏移,并返回 ... 。(Tag 1)
(Origin)-(Tag 1)
(0pt, 0pt)
$(Origin)-(Tag 1)$
解决方案是在 TikZ 进行坐标计算时停止使用局部变换,并在该计算中使用。
\documentclass{article}
%\url{https://tex.stackexchange.com/q/584452/86}
\usepackage{tikz}
\usetikzlibrary{positioning,calc,math}
\tikzstyle{help lines}=[thin,gray!40]
%
%\newdimen\XCoord
%\newdimen\YCoord
\makeatletter
\newcommand*{\ExtractCoordinate}[1]{\path[reset cm] (#1); \pgfgetlastxy{\XCoord}{\YCoord};}%
%
\begin{document}
\begin{tikzpicture}
%\draw[help lines,step=1] (-3,-3) grid (3,3);
\coordinate (Origin) at (0,0);
%- Red
\begin{scope}[thick,color=red,shift={(-2,0.5)}]
\coordinate (Tag 1) at (0,0);
\draw[fill] (Tag 1) circle (4pt) node[above,yshift=0.1cm] {Tag 1};
\ExtractCoordinate{$(Origin)-(Tag 1)$};
\tikzmath{
\middleAng = atan2(\YCoord,\XCoord);
}
\foreach \y in {0.5,0.75,1}
\draw[domain=\middleAng-15:\middleAng+15] plot ({\y*cos(\x)}, {\y*sin(\x)});
\end{scope}
\ExtractCoordinate{$(Tag 1)-(Origin)$};
\tikzmath{
\middleAng = atan2(\YCoord,\XCoord);
}
\foreach \y in {0.5,0.75,1}
\draw[thick,domain=\middleAng-15:\middleAng+15] plot ({\y*cos(\x)}, {\y*sin(\x)});
\draw[fill] (Origin) circle (4pt) node[right,xshift=0.1cm] {Reader};
\end{tikzpicture}
\end{document}
(请注意,\pgfgetlastxy
将坐标存储在宏中,而不是跳过,因此\newdimen
实际上并没有执行任何操作。)