![箭头与线段连接处的精度(Metapost)](https://linux22.com/image/433655/%E7%AE%AD%E5%A4%B4%E4%B8%8E%E7%BA%BF%E6%AE%B5%E8%BF%9E%E6%8E%A5%E5%A4%84%E7%9A%84%E7%B2%BE%E5%BA%A6%EF%BC%88Metapost%EF%BC%89.png)
箭头末端和线段之间的连接不精确:为什么以及如何纠正这个问题?
\documentclass[border=5mm]{standalone}
\usepackage{luatex85}
\usepackage{luamplib}
\usepackage{unicode-math}
\setmainfont{TeX Gyre Pagella}
\setmathfont{TeX Gyre Pagella Math}
\begin{document}
\mplibtextextlabel{enable}
\begin{mplibcode}
beginfig(1);
numeric u;
u = 1cm;
interim linejoin := mitered;
interim ahangle := 30;
z0 = (0,0);
z1 = (4u,0);
z2 = z1 rotatedaround(z0,50);
z3 = whatever[z0,z1];
(z2-z3) dotprod (z1-z0) = 0;
color pink, forest, royal;
pink = (3/4, 1/3, 1/3);
forest = (1/3, 2/3, 1/4);
royal = (1/3, 1/3, 2/3);
path sq;
sq = unitsquare scaled 6;
fill sq shifted z3 withcolor 1/2[forest, white];
draw fullcircle scaled 1cm shifted z1 withcolor red;
drawoptions(withpen pencircle scaled 1.25pt);
draw sq shifted z3 withcolor forest;
draw z0--z1--z2--cycle withcolor pink;
drawoptions();
draw z2 -- z3 dashed evenly withcolor pink;
drawoptions(withpen pencircle scaled 1.25pt withcolor 3/4[white,blue]);
drawarrow z0 -- z1;
drawarrow z0 -- z2;
drawoptions();
label.bot("$H$", z3);
label.bot("$A$",z0);
label.bot("$B$",z1);
label.top("$C$",z2);
endfig;
\end{mplibcode}
\end{document}
答案1
这里的问题是您选择的线宽、窄设置ahangle
和linejoin
模式之间的交互不良。
如果你看一下,plain.mp
你会看到要填充的箭头定义如下:
(q rotated .5ahangle & reverse q rotated -.5ahangle -- cycle) shifted e
其中是箭头路径的q
最后一条路径,是其末端的点。ahlength
e
表示&
箭头形状在尖端处会变成一个尖角(通常如您所愿)。这与默认笔宽(1/2 bp)和默认 配合得很好linejoin
。
但是当您设置 时linejoin := mitered
,MP 会将角度的绘制委托给 PostScript,因此您只能听天由命,看 PostScript 如何处理尖角。在本例中,这意味着箭头会伸出 一定距离e
。
而且你选择的笔太粗,效果会特别差。
为了使箭头停在正确的位置,简单的方法就是不改变 的默认值linejoin
。这是注释掉第 14 行后的图表:
但是现在你的小绿框看起来有点奇怪...所以如果你必须使用,linejoin := mitered
那么你需要额外的内部变量来控制它。默认情况下,MP 设置,miterlimit = 10;
但如果你将它降低到临界值以下,则可以避免 PostScript 突出效果。
这是你的图表
interim linejoin := mitered;
miterlimit := 3;
现在箭头位于正确的位置并且绿色框看起来没问题,但是 A 处的蓝色角是圆的,因此您可以看到下面突出的粉红色三角形。
我认为从这一切中可以学到的教训是,Metapost 箭头和其他尖角最适合默认的线连接设置,并且线宽范围有限。如果您使用比线宽大得多的线,pencircle scaled 1
您可能需要格外小心所有角。
以下是我的一个参考图表使用 Metapost 绘图注释(第 14 节)。此处的线条是用 绘制的,pencircle scaled 2
以夸大效果。一般来说,使用 时缺陷不太明显pencircle scaled 1/2
。