如何使用 Asymptote 在 3D 表面上制作“线性”循环纹理?

如何使用 Asymptote 在 3D 表面上制作“线性”循环纹理?

我正在尝试在 Asymptote 中重现这个霍普夫环面,具有类似的纹理(三种颜色交替):

在此处输入图片描述

所以我定义了一个这样的笔阵列:

pen[] fflag = {
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    .......

甚至包含更多元素:

pen[] flag;
for(int i = 0; i < 7500; ++i){
    flag[4*i] = rgb("ffffffff");
    flag[4*i+1] = rgb("ff0000ff");
    flag[4*i+2] = rgb("0000ffff");
    flag[4*i+3] = rgb("ff0000ff");  
}

完整代码如下:

settings.render = 4;
settings.outformat = "eps";

size(300,0);
import graph3;
import palette;
//currentlight = light(gray(0.85), ambient=black, specularfactor=13, (0.5,0.5,1), specular=white, viewport=false);
currentprojection=orthographic(0,0,0);
limits((0,0,0),(12,12,12));
    
pen[] fflag = {
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff"), 
    rgb("ffffffff"), rgb("ff0000ff"), rgb("0000ffff"), rgb("ff0000ff")
};

pen[] flag;
for(int i = 0; i < 7500; ++i){
    flag[4*i] = rgb("ffffffff");
    flag[4*i+1] = rgb("ff0000ff");
    flag[4*i+2] = rgb("0000ffff");
    flag[4*i+3] = rgb("ff0000ff");  
}


triple F(pair uv){
  real t = uv.x;
  real phi = uv.y;
  real nlobes = 3;
  real A = 0.44;
  real G = pi/2 - (pi/2-A)*cos(nlobes*t);
  real H = t + A*sin(2*nlobes*t);
  real sinG = sin(G);
  real p1 = cos(G) + 1;
  real p2 = sinG * cos(H);
  real p3 = sinG * sin(H);
  real xden = sqrt(2*p1);
  real cosphi = cos(phi);
  real sinphi = sin(phi);
  real x4 = cosphi*p1;
  real x3 = sinphi*p1;
  real x2 = cosphi*p2 - sinphi*p3;
  real x1 = cosphi*p3 + sinphi*p2;  
  return (x1/(xden-x4), x2/(xden-x4), x3/(xden-x4));
}


surface s = surface(F, (0,0), (2pi,2pi), 60, 65, Spline);
s.colors(palette(s.map(abs), flag));
draw(s);

但结果是:

在此处输入图片描述

我不明白为什么我会得到这个结果。

相关内容