20 请问如何利用循环绘制下面的图象,谢谢

发布于 2026-01-17 20:04:28

image.png
如果逐个图象来画会麻烦一些,请问这几个图象能利用循环绘制吗?

查看更多

关注者
1
被浏览
667
Swit
Swit 认证专家 2026-01-17
LaTeX nubility!
\documentclass[tikz]{standalone}
\definecolor{linecolor}{RGB}{50,50,147}
\definecolor{ballcolor}{RGB}{198,42,29}
\begin{document}

\begin{tikzpicture}[fill=ballcolor,every circle/.style={radius=2pt},draw=linecolor,line width=1.5pt]
  \foreach \i/\xshift in {1/0cm,2/2cm,3/6cm,4/11.5cm} {
    \begin{scope}[xshift=\xshift]
      \foreach \j in {1,...,\i} {
        \draw (\j*1.5,0) -- ++ (138:\j);
        \draw (\j*1.5,0) -- ++ (-138:\j);
        \fill (\j*1.5,0) circle foreach \k in {1,...,\j} { ++ (138:1cm) circle[]};
        \fill (\j*1.5,0) circle foreach \k in {1,...,\j} { ++ (-138:1cm) circle[]};
      }
    \end{scope}
  }
\end{tikzpicture}

\end{document}

image.png

2 个回答
Absinthe
Absinthe 2026-01-23
这家伙很懒,什么也没写!

asymptote 中利用 for 循环,变换和一些数学计算即可得到如下一个回答:

image.png

完整代码如下:

settings.render=8; settings.outformat="png";
// settings.outformat="pdf"; 
unitsize(1cm);
pen drawpen=purple; pen dotpen=fuchsia;
dotfactor=3;

// 单个锯齿环
// 路径的规律在 t 为单位变换时不难发现
/* 
(0,-1) (1,-1) (1,0)

(0,-1) (1,-1) (1,0)
(0,-2) (1,-2) (2,-2) (2,-1) (2,0)

(0,-1) (1,-1) (1,0)
(0,-2) (1,-2) (2,-2) (2,-1) (2,0)
(0,-3) (1,-3) (2,-3) (3,-3) (3,-2) (3,-1) (3,0)
 */
path zigzagRing(int n, transform t=rotate(45)) {
    path op;
    if (n <= 0) { write("n must > 0"); }
    else {
        for (int i=0; i<=n; ++i) {
            op = op -- (i,-n); 
        }
        for (int i=-(n-1); i<=0; ++i) {
            op = op -- (n,i); 
        }
    }
    return t*op;
}

// 多个锯齿环
path[] zigzagRings(int n, transform t=rotate(45)) {
    path[] op;
    for(int i=1; i<=n; ++i) {
        op = op ^^ zigzagRing(i,t);
    }
    return op;
}

// 绘制并标注生成多个锯齿环所用的点
void drawDotZigzagRings(int n, transform t=rotate(45), 
                        pen drawpen=currentpen, pen dotpen=currentpen) 
{
    path[] op=zigzagRings(n,t);
    for (int i=0; i<n; ++i) {
        draw(op[i],drawpen); dot(op[i],dotpen);
    }
}

// 在同一张图中绘制多个锯齿环
// n+1 是为了添加省略号
// 平移量的确定
// n = 1 时对应 sqrt(2)*1+d
// n = 2 时对应 sqrt(2)*1+d + sqrt(2)*2+d
// ...
// 不难得到
// n = i 时对应 sqrt(2)*(1+2+...+i)+d*(1+1+...+1)
// = (i-1)^2+(i-1))/2+i*d
real d=0.7; int n=5;
for (int i=1; i<=(n+1); ++i) {
    pair shiftpair=(sqrt(2)*((i-1)^2+(i-1))/2+i*d,0);
    if (i==(n+1)) {
        label("$\cdots$",shiftpair);
    } else {
        drawDotZigzagRings(i,shift(shiftpair)*rotate(45),drawpen,dotpen);
    }
}

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览