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

完整代码如下:
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);
}
}




















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