例如:
path p[];
p1 := (0,0)--(5cm,0)--(5cm,5cm);
p2 := p1 shifted (7cm,0);
p3 := p2 shifted (7cm,0);
p4 := p3 shifted (7cm,0);
p5 := p4 shifted (7cm,0);
linecap := squared;
pickup pencircle scaled 1cm; draw p1 withcolor red;
pickup pencircle scaled 1bp; draw p1;
pickup pencircle scaled 1cm; draw p2 withcolor red;
pickup pencircle scaled 1bp; draw p2;
pickup pensquare scaled 1cm; draw p3 withcolor red;
pickup pensquare scaled 1bp; draw p3;
linejoin := mitered;
pickup pensquare scaled 1cm; draw p4 withcolor red;
pickup pensquare scaled 1bp; draw p4;
linecap := butt;
linejoin := mitered;
pickup pencircle scaled 1cm; draw p5 withcolor red;
pickup pencircle scaled 1bp; draw p5;
生成:
第三幅画并不是我所期待的。
答案1
@mickep 的评论是正确的;的设置linecap
实际上是指默认的圆形笔。这张图片是我试图解释发生了什么。
这显示了默认笔pencircle
在不同设置下发生的情况linecap
。在中间,阴影稍暗,你可以看到默认设置linecap := rounded
。灰线显示我使用缩放到绘制的测试路径pencircle
,1cm
红线显示使用默认pencircle
缩放到 0.5pt 绘制的相同路径。细黑线是envelope
路径和笔的。最后,我在测试路径的每个点上用蓝色绘制了笔的轮廓。
在左侧,您可以看到使用 时发生的情况linecap := butt
。MP 通过在笔的中间绘制来切断路径。在右侧,使用 时linecap := squared
,这条穿过笔中间的相同线条已沿着路径方向推到笔的远边。
现在将同一幅画与另外两支笔进行比较。上行是pensquare scaled 1cm
,下行是pensquare scaled 1cm rotated 45
。
稍加想象,您就会发现线端也遵循了相同的程序。对于linecap := rounded
,端点实际上根本不是“圆形的”,它们只是通过在路径末端的点上绘制笔而形成的。而对于 ,linecap := butt
端点是通过切割笔的中间而形成的,在第一种情况下会形成 45° 角。您可以看到相同的效果,linecap := squared
再次出现穿过笔中间的线被推到笔的远边的情况。
因此,回答 OP 的问题:如果您设置了非默认值linecap
,您会发现pensquare
线条以一个角度结束,因为线条封盖例程是为默认圆形笔设计的。
如果您确实希望用很粗的线条绘制线条pensquare
并linecap
设置为butt
或,一种可能的缓解方法squared
是将笔旋转 45°(如图所示),以便穿过笔中间的线与路径的方向正交。
为了完整性,这里是我的 MP 图表源代码(您可以用它进行编译lualatex
)。
\documentclass[border=5mm]{standalone}
\usepackage{luamplib}
\begin{document}
\mplibtextextlabel{enable}
\begin{mplibcode}
beginfig(1);
numeric u; u = 1cm;
pen P[];
P1 = makepen(for i=1 upto 90: 1/2 dir 4i -- endfor cycle) scaled u;
P2 = pensquare scaled u;
P3 = pensquare scaled u rotated 45;
path crook; crook = origin -- (5u, 0) -- 8u * dir 42;
string name[];
name[butt] = "butt";
name[rounded] = "rounded";
name[squared] = "squared";
for cap = rounded, butt, squared:
interim linecap := cap;
for j = 1, 2, 3:
pair s; s = (cap, -j) scaled 8u;
draw crook shifted s withpen P[j] withcolor (15/16 if cap=rounded: - 1/8 fi);
draw envelope P[j] of crook shifted s;
for k=0, 1, 2:
draw makepath(P[j]) shifted point k of crook shifted s withcolor blue;
endfor
draw crook shifted s withcolor red;
label(name[cap], s + 40 up);
endfor
endfor
endfig;
\end{mplibcode}
\end{document}
笔记
- 您只能使用
envelope
多边形笔,所以我用P1 = makepen(for i=1 upto 90: 1/2 dir 4i -- endfor cycle) scaled u
代替P1 = pencircle scaled u
。90 边形的正多边形看起来与圆形非常相似...