![使用 Metapost 绘制虚线闭合路径](https://linux22.com/image/447065/%E4%BD%BF%E7%94%A8%20Metapost%20%E7%BB%98%E5%88%B6%E8%99%9A%E7%BA%BF%E9%97%AD%E5%90%88%E8%B7%AF%E5%BE%84.png)
答案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