考虑一下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.
生成结果:
您可以将 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