MetaPost:我的 buildcycle 代码没有正确的输出,并且没有任何变化

MetaPost:我的 buildcycle 代码没有正确的输出,并且没有任何变化
beginfig(1)
input hatching;
      u := 5 mm;
      path xtelg,ytelg;
  xtelg := (-4u,0) -- (6u,0);
  ytelg := (0,-4u) -- (0,9u);
  drawarrow xtelg;
  drawarrow ytelg;
  path parab, paraa,m,n,kujund;
  parab:= (0u,8u) for i=0.5 step .5 until 6: .. (i*u, (i*i-6*i+8)*u) endfor;
  paraa:= (-3u,5u) for i=-2 step .5 until 3: ..(i*u,(i*i-4)*u) endfor;
  draw parab;
  draw paraa;
  m:=(0,-4u)--(0,8u) for i=0 step 0.5 until 2: ..(i*u,(i**2-6*i+8)*u) endfor;
  n:=(0,-4u) for i=0 step 0.5 until 2: ..(i*u,(i**2-4)*u) endfor;
  kujund:=buildcycle(m,n);
  hatchfill kujund withcolor(45,1mm,.5bp);
  draw kujund;
endfig;
end

正如我上面提到的,我不知道为什么 hatchfill 无法填充我的图表。

答案1

代替

kujund:=buildcycle(m, n);

尝试

kujund:=buildcycle(reverse m, n);

或者

kujund:=buildcycle(m, reverse n);

无论哪种方式,它对我来说都有效:

在此处输入图片描述

顺便说一句,buildcycle如果只使用两个路径,这个宏可能会比较棘手。请参阅Metapost 文档第 30-32 页,详细了解其工作原理。鉴于这种工作方式,似乎通过询问

buildcycle(m,n)

它导致 Metapost 在两个点(我猜是 (0,-4) 和两个抛物线的交点)甚至一个点(我猜是 (0,-4))之间建立一个循环,因此没有明显的结果。然而

buildcycle(m, reverse n)

引导其在预期的交叉点之间构建所请求的循环。

答案2

这是一个稍微简单的版本,它删除了临时路径mn,并使用-axis 直接在buildcycle命令中(这也消除了反转其中一条路径的需要)。

prologues := 3;
outputtemplate := "%j%c.eps";

input hatching

beginfig(1);
    numeric u;
    u = 5 mm;

    path xtelg,ytelg;
    xtelg = (4 left -- 6 right) scaled u;
    ytelg = (4 down -- 9 up) scaled u;

    path parab, paraa, kujund;
    parab = ((0, 8) for i=1/2 step 1/2 until 6: .. (i, i**2 - 6i + 8) endfor) scaled u;
    paraa = ((-3, 5) for i=-2 step 1/2 until 3: .. (i, i**2 - 4) endfor) scaled u;

    kujund = buildcycle(ytelg, parab, paraa);

    drawoptions(withcolor 1/2 white);
    hatchfill kujund withcolor (45, 3, -1/2);
    drawoptions();

    draw parab;
    draw paraa;
    drawarrow xtelg;
    drawarrow ytelg;

endfig;
end.

在此处输入图片描述

相关内容