从某一点开始画圆弧,使它们彼此相对

从某一点开始画圆弧,使它们彼此相对

我正在尝试绘制两个以任意点为原点的圆弧扇区。我觉得我在这里遗漏了一些东西,因为这应该可行,但是,正如您在下图中看到的那样,红色圆弧集中在 +90 度,而不是面向黑点:

在此处输入图片描述

我正在做的是(下面的MWE):

  1. 如果我想从红点到黑点画三条圆弧,我使用宏\ExtractCoordinate来获取黑点的坐标。
  2. 然后,我使用tikzmathatan2来获取红点和黑点之间的角度。由于我在范围内,我不需要红点坐标,因为它在范围内定义为 (0,0) <- (!) 我觉得错误可能出在这里。
  3. 最后,我绘制了三个具有不同半径的参数化圆弧。

正如您在图片中看到的,此过程适用于黑色 -> 红色之间的弧线,但不适用于红色 -> 黑色之间的弧线。我在这里遗漏了什么?

先感谢您!

梅威瑟:

\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 为您提供了最佳解决方案——为什么要重新发明膨胀波轮?——但我确实发现弄清楚为什么应该起作用的东西没有起作用很有趣。所以这是关于出了什么问题,而不是如何最好地修复它。

您认为问题出在范围上,这是正确的。问题在于范围定义的变换干扰了您的坐标计算。

从本质上讲,据我所知,您在那时试图做的是说“我有两个坐标 - 比如ab- 并且我想从 构建一个 的点。” 没有任何范围,这很简单,因为它b在。a($(b)-(a)$)

但是,当你将变换放入图片中时,事情就会变得有点混乱。坐标被放置在特定点,然后它们被烘焙并且不受局部变换的影响。也就是说,\draw (a) -- (b);无论什么变换有效,都会产生相同的路径,因为当 TikZ 看到(a)(b)关闭变换时,它会解析它们以找出它们的位置。但是一旦 TikZ 找出它们的位置,($(a)-(b)$)它们就会被输入后退进入解析器,现在 TikZ 忘记了它们最初来自坐标,因此应用任何局部变换。

这很有趣,因为有各种错误答案感觉它们应该有效:

  1. 原文\ExtractCoordinate{$(Origin)$}产生该点是(0pt,0pt)因为那是(Origin)在主坐标系中的位置。

  2. 差异(如果不在本地范围的原点,则\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实际上并没有执行任何操作。)

不断扩大的浪潮正朝着正确的方向前进

相关内容