如何在 Metafont 中绘制透明框?我希望有类似此图中图例的内容:https://de.wikipedia.org/wiki/Datei:Articlecount_topten_wikipedia.svg。您可以说我想用透明度“覆盖”框的背景(在网格上方的示例中)。
答案1
[我假设我们谈论的是 MetaPost 而不是 MetaFont]。
您可以在 MetaPost 中通过迭代图片的所有组件并适当地重新着色来实现透明度。以下是网格和简单透明矩形的示例。
prologues := 3;
outputtemplate := "%j%c.eps";
beginfig(1);
% parameters
u = 1cm;
ymax = xmax = 2.75;
xmin = ymin = -2.75;
% make a plain grid
path xx, yy;
xx = ((xmin,0) -- (xmax,0)) scaled u;
yy = ((0,ymin) -- (0,ymax)) scaled u;
drawoptions(dashed evenly scaled .5 withcolor .7 white);
for i = ceiling ymin upto floor ymax: draw xx shifted (0,i*u); endfor
for i = ceiling xmin upto floor xmax: draw yy shifted (i*u,0); endfor
drawoptions(withpen pencircle scaled .7);
xx := xx scaled 1.05;
yy := yy scaled 1.05;
drawarrow xx;
drawarrow yy;
drawoptions();
label.rt (btex $x$ etex, point infinity of xx);
label.top(btex $y$ etex, point infinity of yy);
% draw the "transparent" box
path box; box = unitsquare shifted 1/2 down shifted 1/4 left scaled 3cm;
alpha = 5/8; % alpha: 0=invisible, 1=opaque
color filler; filler = .95[blue,white];
picture bg, fg;
bg = currentpicture; % save the current pic *before* filling the box
fg = image(
for e within bg:
draw e if 5=colormodel e: withcolor alpha[colorpart e, filler] fi;
endfor
);
clip fg to box;
fill box withcolor filler;
draw fg;
draw box;
endfig;
end.
笔记
给定一个图片变量,p
语法for e within p
将遍历图片的所有组件p
。每个组件e
也是一个图片变量。 colormodel e
返回元素所使用的颜色模型;5 表示通常的 RGB 颜色,0 表示无色。 colorpart e
返回元素的颜色。
因此,循环所做的就是重新绘制当前图片的已保存副本中的所有内容,并且对于使用 RGB 颜色着色的每个元素,它使用alpha
原始颜色和用作填充色的颜色之间的颜色重新着色。这创造了一种近似透明的幻觉。
写起来很诱人for e within currentpicture
,但出于某些未知原因,这行不通。您必须将其保存currentpicture
到图片变量中,然后逐步执行。