如何在 TikZ 中绘制一个半径为两点距离倍数的圆?

如何在 TikZ 中绘制一个半径为两点距离倍数的圆?

以下是我的图的 MWE:

\documentclass{article}
\usepackage{caption}  
\usepackage{pgf,tikz}
\usetikzlibrary{arrows,shapes,calc,intersections,through,backgrounds}

\begin{document}
\begin{figure}[b]
   \begin{tikzpicture}[line cap=round,line join=round,>=triangle 45,x=1cm,y=1cm]           
       \coordinate (a) at (1,4);
       \coordinate (p) at (1,5);

       \draw(a) let \p1 = ($ (a) - (p) $) in circle (\pgfmathparse{veclen(\x1,\y1) * 3}\pgfmathresult);
  \end{tikzpicture}
\end{figure}
\end{document}

我收到以下错误:

! Incomplete \iffalse; all text was ignored after line 12.

我不确定这里的问题是什么——如果能得到一些帮助我将非常感激!

答案1

您不需要\pgfmathparse..\pgfmathresult。请注意以下代码中计算周围的额外一对括号,它将函数的括号隐藏veclen在圆半径的分隔符中。

\documentclass[border=1mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
   \begin{tikzpicture}
       \coordinate (a) at (1,4);
       \coordinate (p) at (1,5);
       \draw(a) let \p1 = ($ (a) - (p) $) in
         circle ({veclen(\x1,\y1)*3});

       \fill (a) circle[radius=1pt] node[right]{a};
       \fill (p) circle[radius=1pt] node[right]{p};       
  \end{tikzpicture}
\end{document}

在此处输入图片描述

答案2

请勿\pgfmathparse在 TikZ 的坐标或其他值中使用。

无论如何,TikZ 都会通过 PGF 数学解析几乎所有内容,这也是它不起作用的原因,因为您不能使用不完全可扩展的内容。

你可以使用

\draw(a) let \p1 = ($ (a) - (p) $) in \pgfextra{\pgfmathparse{veclen(\x1,\y1) * 3}}
                                                          circle [radius=\pgfmathresult pt];

但其他人已经给出了比这更好的解决方案。


我想提出另一个选择:through图书馆。

它只有一个目的:通过特定点绘制一个圆。使用这个calc库,你现在可以编写

\node[draw] at (a) [circle through=($(a)!3!(p)$)] {};

效果相同。

如果没有这个calc库,这个可以简化为

\node[draw] at (a) [circle through=(p), scale=3] {};

代码

\documentclass[tikz,convert=false]{standalone}
\usetikzlibrary{through,calc}
\begin{document}
   \begin{tikzpicture}[thick, dot/.style={shape=circle,inner sep=+0pt, minimum size=+2pt, fill, label={#1}}]
       \coordinate[dot=a] (a) at (1,4);
       \coordinate[dot=p] (p) at (1,7);

       \foreach \cnt[count=\Cnt] in {.25, .5, 1, 1.5, 2}
         \node[draw, color=red!\Cnt 0!blue, label={[inner sep=+1pt, red!\Cnt 0!blue]below:$ f = \cnt$}] at (a) [circle through=($(a)!\cnt!(p)$)] {};
  \end{tikzpicture}
   \begin{tikzpicture}[thick, dot/.style={shape=circle,inner sep=+0pt, minimum size=+2pt, fill, label={#1}}]
       \coordinate[dot=a] (a) at (1,4);
       \coordinate[dot=p] (p) at (1,5);

       \node[draw] at (a) [circle through=(p), scale=3] {};
  \end{tikzpicture}
\end{document}

输出

在此处输入图片描述 在此处输入图片描述

答案3

既然您已经let..in在代码中使用了语法,为什么不继续使用该语法来计算所需的半径(将其存储在中\n1),而不是使用\pgfmathparse/\pgfmathresult

我的意思如下:

\begin{tikzpicture}          
  \coordinate (a) at (1,4);
  \coordinate (p) at (1,5);
  \foreach \p in {a,p} \fill[red] (\p) circle(1mm);

  \draw[very thick]  
     let \p1 = ($ (a) - (p) $),  
         \n1 = {3*veclen(\x1,\y1)}
     in (a) circle (\n1);
\end{tikzpicture}

结果

答案4

使用 PSTricks

单身的

\documentclass[pstricks,border=12pt]{standalone}
\usepackage{pst-eucl}
\begin{document}
\begin{pspicture}[showgrid=true](-5,-5)(5,5)
    \pstGeonode(0,0){X}(0,2){Y}
    \pstCircleOA[DistCoef=2,Radius=\pstDistAB{X}{Y}]{X}{<ignored>}
\end{pspicture}
\end{document}

在此处输入图片描述

多种的

\documentclass[pstricks,border=12pt]{standalone}
\usepackage{pst-eucl}
\begin{document}
\multido{\r=.5+.1}{15}{%
\begin{pspicture}[showgrid=true](-5,-5)(5,5)
    \pstGeonode(0,0){X}(0,2){Y}
    \pstCircleOA[DistCoef=\r,Radius=\pstDistAB{X}{Y}]{X}{<ignored>}
\end{pspicture}}
\end{document}

在此处输入图片描述

相关内容