如果绘制了一半以上,则需要出血图案

如果绘制了一半以上,则需要出血图案

我想画一个不可见的大圆圈,里面填充着可见的小圆圈。如果小圆圈的一半以上适合大圆圈,则应该绘制小圆圈(即使它在大圆圈之外)。

如果这不可能的话,如果填充图案不会在大圆圈的边界边缘被切割,留下开放的小圆圈,那就没问题了。

我拥有的代码:

\documentclass[tikz, border=1pt]{standalone}
\usepackage[utf8]{inputenc}
\usetikzlibrary{patterns}

\pgfdeclarepatternformonly[/tikz/radius,\thickness,\size]{rings}
{\pgfpoint{-0.5*\size}{-0.5*\size}}
{\pgfpoint{0.5*\size}{0.5*\size}}
{\pgfpoint{\size}{\size}}
{
    \pgfsetlinewidth{\thickness}
    \pgfpathcircle\pgfpointorigin{\pgfkeysvalueof{/tikz/radius}}
    \pgfusepath{stroke}
}
\newdimen\thickness
\tikzset{
    radius/.initial=4pt,
    size/.store in=\size, size=20pt,
    thickness/.code={\thickness=#1},
    thickness=0.75pt
}

\begin{document}
\begin{tikzpicture}

\path[clip] (0,0) circle (3cm);
\path[pattern=rings, radius=2pt, size=9pt] (-3,-3) rectangle (3,3);

\end{tikzpicture}
\end{document}

我得到的是: 我得到了什么

我想要的是: 我想要的是

答案1

这需要进一步调整,而且可能不是最优雅的方式。

我使用条件绘图来获得(几乎)你想要的东西。

\documentclass[tikz, border=1pt]{standalone}
\usepackage[utf8]{inputenc}

\begin{document}
\begin{tikzpicture}

\foreach \k in {-10,-9,...,10}{
 \foreach \j in {-10,-9,...,10}{
        \pgfmathparse{ifthenelse(sqrt(pow(\k,2)+pow(\j,2))<10,1,0}%\pgfmathresult
    \draw[red,circle, radius=2pt] (\pgfmathresult*\k*4pt,\pgfmathresult*\j*4pt) circle (2pt);

    }
}

\end{tikzpicture}
\end{document}

在此处输入图片描述

版本 2 感谢@MaxSnippe 的条件语句,这正是我想要做的。这非常接近原帖者的问题。

我定义了 3 个参数:: \radiuspt 中小圆的半径,\lwidth:pt 中小圆的线宽,以及\clipradius:pt 中用于剪切的大圆的半径。

如果您想要其他剪辑形状,您可以轻松更改约束。

\documentclass[tikz, border=1pt]{standalone}
\usepackage[utf8]{inputenc}
\usetikzlibrary{calc}

\begin{document}
\begin{tikzpicture}
% Lengths in pt
\pgfmathsetmacro{\radius}{4}
\pgfmathsetmacro{\lwidth}{1}
\pgfmathsetmacro{\clipradius}{10-0.5}

\foreach \k in {-10,-9,...,10}{
    \foreach \j in {-10,-9,...,10}{
        \pgfmathparse{ifthenelse(sqrt(pow(\k,2)+pow(\j,2))<\clipradius,1,0}
        \ifnum\pgfmathresult=1
            \draw[red,line width=\lwidth] (\k*2*\radius+\k*\lwidth pt,\j*2*\radius+\j*\lwidth pt) circle (\radius pt);
        \fi
    }
}

\end{tikzpicture}
\end{document}

在此处输入图片描述

版本 3 我添加了周围的圆圈并修改了测试表达式以与之匹配。请注意,根据要求,只有当小圆圈的中心位于大圆圈之外时,才会剪裁它们

\documentclass[tikz, border=1pt]{standalone}
\usepackage[utf8]{inputenc}
\usetikzlibrary{calc}

\begin{document}
\begin{tikzpicture}
\pgfmathsetmacro{\radius}{4}
\pgfmathsetmacro{\lwidth}{1}
\pgfmathsetmacro{\clipradius}{80}

\foreach \k in {-10,-9,...,10}{
    \foreach \j in {-10,-9,...,10}{

        \pgfmathparse{ifthenelse(sqrt(pow(\k*2*\radius+\k*\lwidth,2)+pow(\j*2*\radius+\j*\lwidth,2))<\clipradius,1,0}%\pgfmathresult
        \ifnum\pgfmathresult=1
            \draw[red,line width=\lwidth] (\k*2*\radius+\k*\lwidth pt,\j*2*\radius+\j*\lwidth pt) circle (\radius pt);
        \fi
    }
}
 \draw[blue,line width=\lwidth] (0,0) circle (\clipradius pt);

\end{tikzpicture}
\end{document}

在此处输入图片描述

答案2

这是一个简单的方法元帖子

\documentclass[border=5mm]{standalone}
\usepackage{luatex85}
\usepackage{luamplib}
\begin{document}
\mplibtextextlabel{enable}
\begin{mplibcode}
beginfig(1);
  r = 10; R = 400;
  draw fullcircle scaled 2R withcolor red;
  for x=-R step 2r until R:
    for y=-R step 2r until R:
      if x++y <= R-r: 
        draw fullcircle scaled 2r shifted (x, y);
      fi
    endfor
  endfor
endfig;
\end{mplibcode}
\end{document}

这是包裹在luamplib因此运行它lualatex(或者使其适应普通 MP...)。

这是输出。调整大小Rr适应。画红圈只是为了表明我们没有超出限制。

在此处输入图片描述

表达式x++y返回毕达哥拉斯和和。这给出了从 到原点的距离。当此距离小于大半径减去小半径时,我们画一个圆xy(x,y)

if或者你可以(正如 OP 所要求的)通过将条件更改为,如果超过一半的圆圈适合,则可以绘制圆圈x++y<R

if x++y < R: 
   draw fullcircle scaled 2r shifted (x, y);
fi

生成如下内容:

在此处输入图片描述

当您对结果满意时,您当然可以去掉红色圆圈......

相关内容