我需要创建一个徽标(好吧,是徽标的一部分)作为轮廓。MetaPost 中的相关部分如下:
beginfig(1)
path ellipse;
ellipse = fullcircle xscaled 5in yscaled 1in;
for k = 0 step 45 until 135:
fill ellipse rotated k;
endfor;
for k = 0 step 45 until 135:
unfill ellipse scaled 0.8 rotated k;
endfor;
endfig;
end.
有了这个我得到了
因为unfill
只是用白色填充。
我想要获取一个包含空白区域的 eps、pdf 或 svg。像这样:
当然,如果曲线是最佳的就更好了,否则当徽标用于文本时,就会产生一些不愉快的意外。最佳解决方案只有两条路径:一条由 16 条逆时针贝塞尔曲线组成,另一条内部路径由 16 条较小的贝塞尔曲线组成。
现在我刚刚将黑白徽标导出为 6000dpi png,然后使用该程序autotrace
获取曲线。有没有更优雅的方法来做到这一点?
答案1
我不是 MetaPost 专家,但经过一些实验后我得到了这个结果。
beginfig(1)
path ellipse, segment, outline, outside, inside;
pair start, stop;
ellipse = fullcircle xscaled 5in yscaled 1in;
stop := ellipse intersectionpoint (ellipse rotated 45);
start := (ellipse rotated -45) intersectionpoint ellipse;
segment := (ellipse cutbefore start) -- (ellipse cutafter stop);
outline := segment for k = 45 step 45 until 315: -- segment rotated k endfor -- cycle;
outside := outline;
inside := outline scaled 0.8;
fill outside -- (reverse inside) -- cycle;
endfig;
我修改了你的代码,将花形放入路径变量中outline
。然后我使用了一个技巧,只填充了区域之间这两条曲线。我不知道这方面的正确参考资料;Metafun 手册(第 1.5 节)确实谈到了这一点,说
此功能取决于 POSTSCRIPT 填充封闭路径的方式,即填充曲线的左侧或右侧。
请注意reverse
,它起着至关重要的作用:它反转了内部路径的方向。如果您draw
不看fill
形状,您会看到更多正在发生的事情。
正如@Aditya 所暗示的,MetaPost 无法真正unfill
区分区域。但在特殊情况下,您可以使用这种方法来绕过该限制。