绘制一个透明的盒子(在网格上)

绘制一个透明的盒子(在网格上)

如何在 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到图片变量中,然后逐步执行。

相关内容