我想画一个不可见的大圆圈,里面填充着可见的小圆圈。如果小圆圈的一半以上适合大圆圈,则应该绘制小圆圈(即使它在大圆圈之外)。
如果这不可能的话,如果填充图案不会在大圆圈的边界边缘被切割,留下开放的小圆圈,那就没问题了。
我拥有的代码:
\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 个参数::
\radius
pt 中小圆的半径,\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...)。
这是输出。调整大小R
以r
适应。画红圈只是为了表明我们没有超出限制。
表达式x++y
返回毕达哥拉斯和和。这给出了从 到原点的距离。当此距离小于大半径减去小半径时,我们画一个圆x
。y
(x,y)
if
或者你可以(正如 OP 所要求的)通过将条件更改为,如果超过一半的圆圈适合,则可以绘制圆圈x++y<R
:
if x++y < R:
draw fullcircle scaled 2r shifted (x, y);
fi
生成如下内容:
当您对结果满意时,您当然可以去掉红色圆圈......