图中空白区域和最佳曲线拟合

图中空白区域和最佳曲线拟合

我需要创建一个徽标(好吧,是徽标的一部分)作为轮廓。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区分区域。但在特殊情况下,您可以使用这种方法来绕过该限制。

相关内容