如何使用路径上的前一个点来指定下一个点?

如何使用路径上的前一个点来指定下一个点?

考虑一下test.mf

draw (10,20)--(10+100,20)--(10+100,20+50)--
  (10+100+30,20+50)--(10+100+30,20+50-40);
showit;
end

在 metafont/metapost 中,有没有一种方法可以在给定方向上绘制给定长度的线,而无需指定其他变量和重复坐标?类似于上面示例的伪代码:

draw (10,20)--<100right>--<50up>--<30right>--<40down>;

编辑

我想到了这个但我无法让它发挥作用:

pair wire[][];
z0=(10,20);
xpart(wire1\1)=x0+100; ypart(wire1\1)=y0;
xpart(wire1\2)=xpart(wire1\1); ypart(wire1\2)=ypart(wire1\1)+50;
xpart(wire1\3)=xpart(wire1\2)+30; ypart(wire1\3)=ypart(wire1\2);
xpart(wire1\4)=xpart(wire1\3); ypart(wire1\4)=ypart(wire1\3)-40;
numeric n; n:=0;
draw z0 forever :
  n:=n+1;
  exitif unknown wire1[n];
  -- wire1[n]
  endfor;
end

答案1

没有内置功能可以做到这一点,但编写自己的宏并不难。如果你时间不够,你可以使用或turtle借用mfpic宏。

像这样:

prologues := 3;
outputtemplate := "%j%c.eps";
input grafbase
beginfig(1);
draw turtle((10,20), 100 right, 50 up, 30 right, 40 down);
endfig;
end.

生成结果:

enter image description here

您可以将 mfpic 宏与 Metafont 以及 Metapost 一起使用。请参阅texdoc mfpic以了解详情。

如果您想编写自己的宏,可以尝试如下操作:

vardef turtle (text t) =
    save n, nose, track;
    pair nose, track[];
    numeric n;
    nose = origin;
    n = 0;
    for @ = t:
        nose := nose + @;
        track[n] := nose;
        n := n+1;
    endfor
    track[0] for i=1 upto n-1: -- track[i] endfor
enddef;

尽管您可能希望通过一些错误检查使其更加健壮。

答案2

这是您尝试的精神(第二张图)

outputtemplate := "%j-%c.mps";

beginfig(1);
z1 = (10,20);
z2 = z1 + (100,20);
z3 = z2 + (0,50);
z4 = z3 + (30,0);
z5 = z4 + (0,-40);

draw z1 -- z2 -- z3 -- z4 --z5;
endfig;


beginfig(2);
pair myz[];
myz[1] = (10,20);
myz[2] = myz[1] + (100,20);
myz[3] = myz[2] + (0,50);
myz[4] = myz[3] + (30,0);
myz[5] = myz[4] + (0,-40);

numeric n;  n:=1;
path p;     p:=myz1;

   forever :
     n:=n+1;
     exitif unknown myz[n];
     p := p -- myz[n];
   endfor;

draw p;

endfig;

end

相关内容