绘制具有特定外半径的 TikZ 圆圈

绘制具有特定外半径的 TikZ 圆圈

对于射箭目标,我需要绘制(并填充)一个直径恰好为 10 厘米的圆圈包括它的线。但是,当使用 TikZscircle路径命令时,给定的半径是线的中间,因此打印的圆太大。

解决方案应该取决于当前的线宽。

这是我目前的代码。绘制的线条明显超出了给定的半径,但应该完全在半径内绘制。

\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[x=1cm, y=1cm, line width=2mm]
    \path [draw=black,fill=yellow] (0,0) circle (5cm);
    \path [draw=black,fill=red] (0,0) circle (4cm);
    \path [draw=black,fill=green,line width=3mm] (0,0) circle (3cm);
    \draw [thin,gray] (-6,-6) grid (6,6);
\end{tikzpicture}
\end{document}

例子

答案1

tikz任何路径命令的任何坐标中,都为无限细的线确定。实线位于它们上方,以便它们的中心匹配。

实线的线宽可以通过长度来获得\pgflinewidth。了解了它,通过考虑线宽,就可以轻松地校正一些基本形状(如矩形、正方形和圆形)的大小。例如:

  • 矩形: \draw[very thick] (x1+0.5\pgflinewidth,y1+0.5\pgflinewidth) rectangle (x2-0.5\pgflinewidth,y2+0.5\pgflinewidth);其中x1y1x2y2是矩形的坐标。两个矩形比较的示例:红色矩形的宽度为4cm + \pgflinewidth = 4.1cm,黄色矩形的宽度(我们可以看到它的边框,它是半透明的)正好是4cm

\documentclass[tikz, margin=3mm]{standalone}

\begin{document}
\begin{tikzpicture}[line width=2mm]
    \draw[red]   (0,0) rectangle (4,4);
    \draw[yellow,semitransparent]  (0.5\pgflinewidth,0.5\pgflinewidth) rectangle (4cm-0.5\pgflinewidth,4cm-0.5\pgflinewidth);
%
    \draw [thin,gray] (-1,-1) grid (5,5);
\end{tikzpicture}
\end{document}

在此处输入图片描述

  • 圆: 圆半径\draw[very thick] (0,0) circle (<radius>-0.5\pgflinewidth); 为 的<radius>大小。两个圆的比较示例与上面矩形的比较类似:红色圆的直径为2cm + \pgflinewidth = 4.1cm,黄色圆的直径恰好为4cm

\documentclass[tikz, margin=3mm]{standalone}

\begin{document}
\begin{tikzpicture}[line width=2mm]
    \draw[red]   (0,0) circle (2cm);
    \draw[yellow,semitransparent]  (0,0) circle (2cm-0.5\pgflinewidth);
%
    \draw [thin,gray] (-3,-3) grid (3,3);
\end{tikzpicture}
\end{document}

在此处输入图片描述

考虑到上述情况,问题的圆具有与给定圆半径完全相同的外线边界,如下所示:

\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[x=1cm, y=1cm, line width=2mm]
    \path [draw=blue,fill=yellow] (0,0) circle (5cm-0.5\pgflinewidth);
    \path [draw=black,fill=red] (0,0) circle (4cm-0.5\pgflinewidth);
    \path [draw=black,fill=green,line width=3mm] (0,0) circle (3cm-0.5\pgflinewidth);
    \draw [thin,gray] (-6,-6) grid (6,6);
\end{tikzpicture}
\end{document}

在此处输入图片描述

答案2

dimen在 PSTricks 中,只需设置为默认值 (outer)即可轻松解决此问题o。但是,名为的包默认pst-eucl设置dimenm(middle)。还有一个选项是iinner。

我特意将笔触设置为,dashed这样我们也可以看到

  • 描边是在填充非剪切路径后进行的,
  • 填充是在剪切路径中描边后进行的,
  • 笔触的中间用作填充或剪裁边界。

\documentclass[border=1cm,pstricks]{standalone}
\psset
{
    fillstyle=solid,
    fillcolor=yellow,
    linewidth=1,
    linecolor=cyan,
    linestyle=dashed,
}

\begin{document}
\begin{pspicture}[showgrid=t](-3,-3)(3,3)   
    \pscircle{2}
    \rput(0,0){outer}
\end{pspicture}
\begin{pspicture}[showgrid=t](-3,-3)(3,3)   
    \pscircle[dimen=m]{2}
    \rput(0,0){middle}
\end{pspicture}
\begin{pspicture}[showgrid=t](-3,-3)(3,3)   
    \pscircle[dimen=i]{2}
    \rput(0,0){inner}
\end{pspicture}
\end{document}

在此处输入图片描述

在此处输入图片描述

在此处输入图片描述

笔记

某些封闭曲线(包括通过 创建的曲线pscustom)和开放曲线具有不同的默认值dimen,这些默认值可以更改,也可以不更改。有关详细信息,请参阅源代码。

要求的结果

\documentclass[border=1cm,pstricks]{standalone}
\begin{document}
\begin{pspicture}[showgrid=t,fillstyle=solid,linewidth=2mm](-5,-5)(5,5) 
    \pscircle[fillcolor=yellow]{5}
    \pscircle[fillcolor=red]{4}
    \pscircle[fillcolor=green]{3}
\end{pspicture}
\end{document}

在此处输入图片描述

答案3

这是一个老问题,但无论如何,这里有一个使用的自动化方法decorations

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{decorations.pathmorphing}
\begin{document}
  \begin{tikzpicture}[line width=2mm]
    \begin{scope}[every path/.style={decoration={curveto,raise=.5\pgflinewidth},decorate}]
      \path [draw=black,fill=yellow] (0,0) circle (5cm);
      \path [draw=black,fill=red] (0,0) circle (4cm);
      \path [draw=black,fill=green,line width=3mm] (0,0) circle (3cm);
    \end{scope}
    \draw [thin,gray] (-6,-6) grid (6,6);
  \end{tikzpicture}
\end{document}

在此处输入图片描述

笔记 :缺点是curveto所有的曲线都被无数的小段代替,所以圆(实际上从来不是一个圆)变成了一个巨大的多边形(具有更大的尺寸占用空间)。

答案4

这是对这个老问题的另一个回答,使用剪辑并将线宽加倍。我把它放在宏中\innerpath

\documentclass{standalone}
\usepackage{tikz}
\def\innerpath[#1]#2;{
  \begin{scope}
    \clip #2;
    \path [#1,line width=2\pgflinewidth] #2;
  \end{scope}
}
\begin{document}
  \begin{tikzpicture}
    \innerpath[draw=black,fill=yellow,line width=2mm] (0,0) circle (5cm);
    \innerpath[draw=black,fill=red,line width=2mm] (0,0) circle (4cm);
    \innerpath[draw=black,fill=green,line width=3mm] (0,0) circle (3cm);
    \draw [thin,gray] (-6,-6) grid (6,6);
  \end{tikzpicture}
\end{document}

在此处输入图片描述

笔记:这段代码也有一个问题。我不明白为什么如果我line width=2mm从前两个命令移动到整个图片范围,它会将线宽修改 2^2=4 而不是 2。

相关内容