在 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}