平面交点-2(Asymptote 中的矢量图形)

平面交点-2(Asymptote 中的矢量图形)

这是我自己问题. 当以下 MWE 工作并正确编译时。

\documentclass{article}
\usepackage{asymptote}
\begin{document}
\begin{asy}
settings.outformat = "pdf";
settings.prc = false;
settings.render = 0;
import three;
import bsp;
texpreamble("\usepackage{euler,beton}");
size(5cm, 0);
currentprojection=orthographic((5,4,3));

path3 pl =plane((0,-2,0),(-2,0,0),(0,1,0));
path3 pl1=rotate(-28,X)*pl;
path3 pl2=rotate(-56,X)*pl;
path3 pl3=shift(-0.3*normal(pl1))*pl1;

triple[] asd=intersectionpoints(pl2,pl3);
triple A=asd[1];
triple B=asd[0];

triple[] asf=intersectionpoints(pl,pl2);
triple C=asf[1];
triple D=asf[0];

triple[] asg=intersectionpoints(pl,pl3);
triple E=asg[1];
triple F=asg[0];

path3 q11=(D -- -Y -- C-Y -- C -- cycle);
surface sq11=surface(q11);
draw(sq11,white+opacity(.6),light=nolight);
draw(D -- -Y -- C-Y -- C--cycle);

path3 q21=rotate(-28,X)*q11;
surface sq21=surface(q21);
draw(sq21,white+opacity(.6),light=nolight);
draw(rotate(-28,X)*(D -- -Y -- C-Y -- C -- cycle));

path3 q31=(D--C--A--B--cycle);
surface sq31=surface(q31);
draw(sq31,white+opacity(.6),light=nolight);
draw(D--C--A--B--cycle);

path3 q34=(C -- D -- rotate(-56,X)*(D+Y) -- rotate(-56,X)*(C+Y) -- cycle);
surface sq34=surface(q34);
draw(sq34,white+opacity(.6),light=nolight);
draw(C -- D -- rotate(-56,X)*(D+Y) -- rotate(-56,X)*(C+Y) -- cycle);

path3 q22=(C -- D -- rotate(-28,X)*(D+Y) -- rotate(-28,X)*(C+Y) -- cycle);
surface sq22=surface(q22);
draw(sq22,white+opacity(.6),light=nolight);
draw(C -- D -- rotate(-28,X)*(D+Y) -- rotate(-28,X)*(C+Y) -- cycle);

path3 q12=(D -- C -- E -- F -- cycle);
surface sq12=surface(q12);
draw(sq12,white+opacity(.6),light=nolight);
draw(q12);

surface s4=surface(pl3);
draw(s4,white+opacity(.6),light=nolight);
draw(pl3);

path3 q32=(rotate(-56,X)*(D-Y) -- rotate(-56,X)*(C-Y) -- A -- B -- cycle);
surface sq32=surface(q32);
draw(sq32,white+opacity(.6),light=nolight);
draw(rotate(-56,X)*(D-Y) -- rotate(-56,X)*(C-Y) -- A -- B -- cycle);

path3 q13=(Y -- C+Y -- E -- F -- cycle);
surface sq13=surface(q13);
draw(sq13,white+opacity(.6),light=nolight);
draw(Y -- C+Y -- E -- F -- cycle);

dot(A,red);
dot(B,red);
dot(C,red);
dot(D,red);
dot(E,red);
dot(F,red);

//From Charles Staats's tutorial
//Direction of a point toward the camera.
triple cameradirection(triple pt, projection P=currentprojection) {
  if (P.infinity) {
    return unit(P.camera);
  } else {
    return unit(P.camera - pt);
  }
}

//Move a point closer to the camera.
triple towardcamera(triple pt, real distance=1, projection P=currentprojection) {
  return pt + distance * cameradirection(pt, P);
}

label("$A$",align=NE,position=towardcamera((A)));
label("$B$",align=S,position=towardcamera((B)));
label("$C$",align=SE,position=towardcamera((C)));
label("$D$",align=SW,position=towardcamera((D)));
label("$E$",align=NE,position=towardcamera((E)));
label("$F$",align=S,position=towardcamera((F)));
\end{asy}
\begin{asy}
settings.outformat = "pdf";
settings.prc = false;
settings.render = 0;
import three;
import bsp;
texpreamble("\usepackage{euler,beton}");
size(5cm, 0);
currentprojection=orthographic((5,4,3));

path3 pl =plane((0,-2,0),(-2,0,0),(0,1,0));
path3 pl1=rotate(-28,X)*pl;
path3 pl2=rotate(-56,X)*pl;
path3 pl3=shift(-0.3*normal(pl1))*pl1;

triple[] asd=intersectionpoints(pl2,pl3);
triple A=asd[1];
triple B=asd[0];

triple[] asf=intersectionpoints(pl,pl2);
triple C=asf[1];
triple D=asf[0];

triple[] asg=intersectionpoints(pl,pl3);
triple E=asg[1];
triple F=asg[0];

path3 q11=(D -- -Y -- C-Y -- C -- cycle);
surface sq11=surface(q11);
draw(sq11,red+opacity(.6),light=nolight);
draw(D -- -Y -- C-Y -- C--cycle,red);

path3 q21=rotate(-28,X)*q11;
surface sq21=surface(q21);
draw(sq21,blue+opacity(.6),light=nolight);
draw(rotate(-28,X)*(D -- -Y -- C-Y -- C -- cycle),blue);

path3 q31=(D--C--A--B--cycle);
surface sq31=surface(q31);
draw(sq31,green+opacity(.6),light=nolight);
draw(D--C--A--B--cycle,green);

path3 q34=(C -- D -- rotate(-56,X)*(D+Y) -- rotate(-56,X)*(C+Y) -- cycle);
surface sq34=surface(q34);
draw(sq34,green+opacity(.6),light=nolight);
draw(C -- D -- rotate(-56,X)*(D+Y) -- rotate(-56,X)*(C+Y) -- cycle,green);

path3 q22=(C -- D -- rotate(-28,X)*(D+Y) -- rotate(-28,X)*(C+Y) -- cycle);
surface sq22=surface(q22);
draw(sq22,blue+opacity(.6),light=nolight);
draw(C -- D -- rotate(-28,X)*(D+Y) -- rotate(-28,X)*(C+Y) -- cycle,blue);

path3 q12=(D -- C -- E -- F -- cycle);
surface sq12=surface(q12);
draw(sq12,red+opacity(.6),light=nolight);
draw(q12,red);

surface s4=surface(pl3);
draw(s4,yellow+opacity(.6),light=nolight);
draw(pl3,yellow);

path3 q32=(rotate(-56,X)*(D-Y) -- rotate(-56,X)*(C-Y) -- A -- B -- cycle);
surface sq32=surface(q32);
draw(sq32,green+opacity(.6),light=nolight);
draw(rotate(-56,X)*(D-Y) -- rotate(-56,X)*(C-Y) -- A -- B -- cycle,green);

path3 q13=(Y -- C+Y -- E -- F -- cycle);
surface sq13=surface(q13);
draw(sq13,red+opacity(.6),light=nolight);
draw(Y -- C+Y -- E -- F -- cycle,red);

dot(A,red);
dot(B,red);
dot(C,red);
dot(D,red);
dot(E,red);
dot(F,red);

//From Charles Staats's tutorial
//Direction of a point toward the camera.
triple cameradirection(triple pt, projection P=currentprojection) {
  if (P.infinity) {
    return unit(P.camera);
  } else {
    return unit(P.camera - pt);
  }
}

//Move a point closer to the camera.
triple towardcamera(triple pt, real distance=1, projection P=currentprojection) {
  return pt + distance * cameradirection(pt, P);
}

label("$A$",align=NE,position=towardcamera((A)));
label("$B$",align=S,position=towardcamera((B)));
label("$C$",align=SE,position=towardcamera((C)));
label("$D$",align=SW,position=towardcamera((D)));
label("$E$",align=NE,position=towardcamera((E)));
label("$F$",align=S,position=towardcamera((F)));
\end{asy}
\end{document}

在此处输入图片描述

现在我无缘无故遇到了问题。当我编译该 MWE 时,会出现一个黑色的空白窗口,然后在第一次运行中很快消失。

在此处输入图片描述

在后续编译运行中它不再出现(我使用 TexStudio)。在输出文档中只出现了为图片保留的空间。没有其他内容。

在此处输入图片描述

如果我将 settings.render = 0; 更改为 settings.render = 16; 一切正常:

在此处输入图片描述

但我必须使用矢量图形。这是出版社的要求。显然,这是编译问题,而不是 Asymptote 问题。如何解决这个问题?我需要像以前一样的矢量图形。@cfr,@CharlesStaats。

%==== 更新 =======

根据@CharlesStaats 的建议我使用了这个超最小工作示例

\documentclass[10pt,a4paper]{article}
\usepackage[utf8x]{inputenc}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{graphicx}
\usepackage{asymptote}
\begin{document}
Hello!

    \begin{figure}[h]
        \begin{asy}
        settings.outformat = "pdf";
        settings.prc = false;
        settings.render = 16;
        import three;
        import bsp;
        texpreamble("\usepackage{euler,beton}");
        size(5cm, 0);
        currentprojection=orthographic((5,4,3));

        path3 pl =plane((0,-2,0),(-2,0,0),(0,1,0));
        path3 pl1=rotate(-28,X)*pl;
        path3 pl2=rotate(-56,X)*pl;
        path3 pl3=shift(-0.3*normal(pl1))*pl1;

        draw (pl);
        draw (pl1);
        draw (pl2);
        draw (pl3);

        triple[] asd=intersectionpoints(pl2,pl3);
        triple A=asd[1];
        triple B=asd[0];

        triple[] asf=intersectionpoints(pl,pl2);
        triple C=asf[1];
        triple D=asf[0];

        triple[] asg=intersectionpoints(pl,pl3);
        triple E=asg[1];
        triple F=asg[0];

        surface s1=surface(pl);
        draw(s1,white+opacity(.6),light=nolight);
        surface s2=surface(pl1);
        draw(s2,white+opacity(.6),light=nolight);
        surface s3=surface(pl2);
        draw(s3,white+opacity(.6),light=nolight);
        surface s4=surface(pl3);
        draw(s4,white+opacity(.6),light=nolight);


        draw(B--A);
        draw(C--D);
        draw(E--F);

        dot(A,red);
        dot(B,red);
        dot(C,red);
        dot(D,red);
        dot(E,red);
        dot(F,red);

        //From Charles Staats's tutorial
        //Direction of a point toward the camera.
        triple cameradirection(triple pt, projection P=currentprojection) {
        if (P.infinity) {
        return unit(P.camera);
        } else {
        return unit(P.camera - pt);
        }
        }

        //Move a point closer to the camera.
        triple towardcamera(triple pt, real distance=1, projection P=currentprojection) {
        return pt + distance * cameradirection(pt, P);
        }

        label("$A$",align=NE,position=towardcamera((A)));
        label("$B$",align=S,position=towardcamera((B)));
        label("$C$",align=SE,position=towardcamera((C)));
        label("$D$",align=SE,position=towardcamera((D)));
        label("$E$",align=NE,position=towardcamera((E)));
        label("$F$",align=S,position=towardcamera((F)));
        \end{asy}

    \end{figure}

Hello world!
\end{document}

黑色窗口又回来了。输出: 在此处输入图片描述

但是!这不是矢量图形!(settings.render = 16;)

使用 settings.render = 0 时工作异常: 在此处输入图片描述

将 document.tex (TexStudio 的标准)放入主文件夹并启动

asy -vv document.tex

这是终端给出的结果(显然没有改变代码中的符号): 在此处输入图片描述

也许我应该安装最新的渐近线,就像评论中建议的那样(有人因为某种原因删除了那条评论)。我甚至提出了问题怎么做?至今没人能给出答案。

相关内容