Asymptote 3D:如何绘制具有图案的表面(例如棋盘格)?

Asymptote 3D:如何绘制具有图案的表面(例如棋盘格)?

在 Asymptote 中,我想绘制两个相交平面,一个平面为纯色,另一个平面带有某种图案(例如棋盘),这样如果打印成黑白两色,看起来会不错。但是,图案模块似乎不起作用。

下面的代码是我想要运行的代码,其中我希望绘制该飞机的语句被注释掉(我当然知道该函数不存在,我只是不知道该使用哪一个)。

settings.prc = false;
defaultpen(fontsize(10pt));
import three;
import graph3;
import patterns;
size(11cm,0);

real rot_param = 0.01;
currentprojection=perspective((10000,-20000,100000),up=(-rot_param,1-rot_param,0));
currentlight = (4,-1,4);

render render = render(compression=Low, merge = true);

limits((0,0,0), (3,3,3));

real delta = 0.75;
real dterm = (1-delta)/delta;

draw(surface(O -- (dterm,0,0) -- (3,3-dterm,0) -- (3,3,0) -- cycle), orange+opacity(0.5), render);
draw(surface(O -- (3,3,0) -- (0,3,0) -- cycle), orange+opacity(0.5), render);
draw(surface(O -- (3,3,0) -- (3,3,3) -- (0,0,3) -- cycle), lightred+opacity(0.5), render);
draw(surface((dterm,0,0) -- (3,3-dterm,0) -- (3,3-dterm,3) -- (dterm,0,3) -- cycle), lightblue+opacity(0.5), render);

// Does not work!
//filldraw(surface((dterm,0,0) -- (3,3-dterm,0) -- (3,3-dterm,3) -- (dterm,0,3) -- cycle), pattern("checker"));

xaxis3("",Bounds,black+dashed,InTicks(3,1));
yaxis3("",Bounds,black+dashed,InTicks(3,1));
//zaxis3("",Bounds,black,InTicks(3,1));
draw(O -- 3.5X,arrow=Arrow3);
label("$\gamma(C)$",3.7X);
draw(O -- 4Y,dashed, arrow=Arrow3);
label("$\gamma(D)$",4.2Y);
draw(O -- 4Z,arrow=Arrow3);
label("$\phi(C,\theta_0)$",(-0.2,0,5));
label("1",(-0.1,0,3));

draw(box((0,0,3),(3,3,3)), black+linewidth(0.6pt));
draw((0,3,0) -- (0,3,3), dashed);
draw((3,3,0) -- (3,3,3));
draw((3,0,0) -- (3,0,3));

它看起来是这样的(我至少想制作蓝色平面棋盘): 生成的图

如果有人知道怎么做,我将不胜感激。以防你不知道我还有其他问题,所以如果有人碰巧知道的话,我会把这些问题抛出来:

  • 我使用的是透视图,但我想使用“斜”透视图(除了“下方”),这样指向“屏幕外”的轴 ($\phi(C,\theta_0)$ 实际上是指向左上方一点。我试图将其近似,如您所见。有办法做到这一点吗?
  • 如何让最后的“3”显示为轴上的标签?
  • 我不希望垂直轴缩放(我希望它比实际显示的更大,所以我只是重新标记,例如 1)。有没有办法自动执行此操作?

答案1

这是一个最小示例,展示了在表面上设置棋盘格图案的优雅方法。要使用此功能,您需要控制如何精确地用面片构建表面;最简单的方法是将表面构建为参数图,并使用nu=和(如果需要)nv=参数。

\documentclass[margin=10pt, convert]{standalone}
\usepackage{asypictureB}
\begin{document}
\begin{asypicture}{name=plane}
settings.outformat="png";
settings.render=4;
size(10cm);
import graph3;      //Need graph3, not just three, for parametric surfaces.

triple uaxis = X, vaxis = Y, c = O;
int n = 8;

triple plane(pair coords) {
    return c + coords.x*uaxis + coords.y*vaxis;
} 

surface s = surface(plane, (0,0), (1,1), nu=n);

material[] surfacepen = new material[] {red, green};
surfacepen.cyclic = true;
if (n % 2 == 0) {
    surfacepen = sequence(new material(int i) {
            if (i >= n) ++i;
            return surfacepen[i];
            }, 
        2n);
    write(surfacepen.length);
    surfacepen.cyclic=true;
}

draw(s, surfacepen=surfacepen);
\end{asypicture}
\end{document}

结果:

在此处输入图片描述

答案2

使用xelatex 或运行latex->dvips->ps2pdf

\documentclass[pstricks]{standalone}
\usepackage{pst-solides3d}
\colorlet{Green}{green!100!white!40}
\begin{document}

\multido{\iA=0+15}{18}{%  Only for the animation, can be deleted
\psset{lightsrc=viewpoint,viewpoint=30 \iA\space 20 rtp2xyz,Decran=25}
\begin{pspicture}(-5,-2)(5,2)
\psSolid[object=grille,grid,
   fcol= /t 0 def 0 1 63 { dup dup 8 mod 0 eq { /t t 1 add def } if 
         t add 2 mod 0 eq { (Green) }{ (red) } ifelse } for, 
  base=-4 4 -4 4]
\end{pspicture}%
}% end of multido

\end{document}

在此处输入图片描述

相关内容