使用 Metapost 绘制虚线闭合路径

使用 Metapost 绘制虚线闭合路径

虚线闭合路径在路径的起点附近通常看起来不太好看。

beginfig(1);
fill fullcircle scaled 300 withcolor white;
draw fullcircle scaled 250 dashed evenly scaled 3;
endfig;

为了获得可接受的结果,可以用接近 3 的数字替换“缩放 3”中的“3”。通过反复试验找到正确的数字是烦人且耗时的,特别是当绘图包含多条路径时。

如何有效地绘制完美的虚线闭合路径?

答案1

这是一个解决方案,可以自动缩放破折号的长度以适合您的路径。

在此处输入图片描述

我已经把它包装在了 中luamplib,因此您需要用 来编译它lualatex,或者将其改编为普通 MP

\documentclass[border=5mm]{standalone}
\usepackage{luamplib}
\begin{document}
\begin{mplibcode}

def with_length(expr a) = dashpattern(on a off a) enddef;

beginfig(1);
    path C; 
    C = fullcircle scaled 250;
    draw C dashed evenly scaled 3 withcolor red;
    draw C shifted 300 right dashed with_length(arclength C / 128);
endfig;

\end{mplibcode}
\end{document}

笔记

  • 关键字evenly实际上是一个虚线图案图片,定义plain.mp如下:picture evenly; evenly=dashpattern(on 3 off 3)

  • 因此当您写入时dashed evenly scaled 3,MP 将以 9bp 开启和 9bp 关闭的模式绘制线条。

  • 如果您的路径长度不是 18 的整数倍,那么您会在开始和结束时遇到可怕的混乱,正如您所发现的。这在上面的示例中以红色显示。

  • 为了解决这个问题,我定义了一个简单的宏with_length,可以让你直接指定破折号的长度。

  • 然后我们需要做的就是测量路径的长度bp,然后除以我们想要的虚线和间隙的数量。

  • 原始命令arclength给出了长度,我选择了 128,因此正好有 64 条破折号和 64 个间隙,它们的大小都相同。

  • 请注意,MP 恰好除以 2 的幂,但对于其他值,可能会出现微小的舍入误差。

答案2

您可以进行一些计算。在这里,我们首先添加 3 毫米开和 3 毫米关的图案。然后我们计算给出的大致虚线数量,最后我们绘制一些修改长度的路径。如果需要,可以将其放入宏中。

\startMPpage[offset=3bp]
path p; p = fullcircle scaled 200;
numeric plen; plen = arclength p;
numeric dashlen; dashlen = 3mm;
    
draw p dashed dashpattern(on dashlen off dashlen) withcolor darkred;

numeric n; n:=plen div dashlen;

if odd(n) : n:=n+1 fi;

dashlen := plen/n;

draw (p xshifted 25) dashed dashpattern(on dashlen off dashlen);
\stopMPpage

在此处输入图片描述

相关内容