为什么 Pensquare 的线条末端会有一个角度?

为什么 Pensquare 的线条末端会有一个角度?

例如:

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。灰线显示我使用缩放到绘制的测试路径pencircle1cm红线显示使用默认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线条以一个角度结束,因为线条封盖例程是为默认圆形笔设计的。

如果您确实希望用很粗的线条绘制线条pensquarelinecap设置为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 边形的正多边形看起来与圆形非常相似...

相关内容