![MetaPost 的取消绘制不会删除整个边框](https://linux22.com/image/442954/MetaPost%20%E7%9A%84%E5%8F%96%E6%B6%88%E7%BB%98%E5%88%B6%E4%B8%8D%E4%BC%9A%E5%88%A0%E9%99%A4%E6%95%B4%E4%B8%AA%E8%BE%B9%E6%A1%86.png)
我正在运行这个例子:
# := 0.5cm;
beginfig(1);
path tr;
tr := origin--(2#, 5#)--(8#, 5#)--(10#, 0#)--cycle;
color cl;
cl := 0.7(green + blue);
pen p;
p := pencircle scaled 2mm;
filldraw tr withcolor cl withpen p;
filldraw tr shifted (12#, 0#) withcolor cl withpen p;
undraw tr shifted (12#, 0#) withpen p;
endfig;
end;
我原本希望undraw
删除全部的图形的边框,但周围留下很细的边框...我的使用出了什么问题undraw
?
答案1
draw
我起初以为这里的困难在于和的定义方式filldraw
,但经过调查后,我认为这不是一个 MP 问题。(见下文)。
首先undraw
,它只是一个宏,定义plain.mp
如下:
def undraw expr p = draw p withcolor background enddef;
因此问题在于draw
和的实现不同filldraw
。它们也是在中定义的宏plain.mp
:
如果你传递一个循环路径p
作为参数,那么
draw
扩展为addto currentpicture doublepath p
但
filldraw
扩展为addto currentpicture contour p
因此,您(和我)认为的明显区别在于原始命令doublepath
和contour
。
☞ 除了用稍大一点的笔来写之外,你可能对此无能为力undraw
。
进一步说明
如果我编译.eps
并检查输出,还有另一条线索
0 0.7 0.7 setrgbcolor 0 5.66928 dtransform truncate idtransform setlinewidth pop
[] 0 setdash 1 setlinejoin 10 setmiterlimit
newpath 0 0 moveto
28.34647 70.86617 lineto
113.38586 70.86617 lineto
141.73233 0 lineto
closepath
gsave fill grestore stroke
newpath 170.0788 0 moveto
198.42526 70.86617 lineto
283.46466 70.86617 lineto
311.81113 0 lineto
closepath
gsave fill grestore stroke
1 1 1 setrgbcolor
newpath 170.0788 0 moveto
198.42526 70.86617 lineto
283.46466 70.86617 lineto
311.81113 0 lineto
closepath stroke
showpage
您不需要是 PostScript 专家就能看到,末尾的两条路径是相同的,一条路径gsave fill grestore stroke
执行filldraw
,而第二条(相同)副本1 1 1 setrgbcolor stroke
执行undraw
。
至此,我认为我们可以得出结论,问题出在 PostScript 层面。(或者可能是在您的查看器或我的打印机或其他试图渲染绘图的设备上)。