如何沿路径等距绘制点?

如何沿路径等距绘制点?

是否可以使用 Metapost 绘制点,使得每个点都沿着任意路径与其第一个邻居相隔相同的距离?

我不希望他们真正的距离是有规律的!相反,我希望他们保持距离沿路径测量平等。

我想说明匀速曲线运动有了它(和均匀变化稍后一个)。

例如,我可能想沿着这条线放置等距的点:

\documentclass[a4paper,10pt]{book}
\usepackage{luamplib}
\everymplib{input mpcolornames; beginfig(1);}
\everyendmplib{endfig;}
\begin{document}
    \begin{mplibcode}
      draw (0,0){right} .. (2cm,4cm){up} .. (4cm,5cm){right} .. (5cm,6cm){up} .. (8cm,7cm){right}
           withpen pencircle scaled 2pt;
    \end{mplibcode}
\end{document}

答案1

要遵循此解决方案,您可能需要查找“arclength”和“arctime”Metapost 手册,或者阅读下面我的解释。

在此处输入图片描述

\documentclass{standalone}
\usepackage{luamplib}
\everymplib{beginfig(1);}
\everyendmplib{endfig;}
\begin{document}
    \begin{mplibcode}
        path P;
        P = (0,0){right} .. (2cm,4cm){up} .. (4cm,5cm){right} .. (5cm,6cm){up} .. (8cm,7cm){right};
        draw P withpen pencircle scaled 2pt withcolor .7 white;
        s = 5mm;
        for t=0 step s until arclength P: 
          drawdot point arctime t of P of P withpen pencircle scaled 4pt withcolor red; 
        endfor
    \end{mplibcode}
\end{document}

笔记

  • 要使用路径,将其保存为变量会很有帮助。MP 有几种变量,,,numeric等等。如果您只是分配给变量,如,MP 会假定它是。因此,要保存,您必须先声明它:pairpathstrings = 5mm;numericpath

    path P;
    P = (0,0).....
    

    然后您可以draw对其进行移动、旋转等等。

  • 您还可以使用 来找出它的长度length P。但是 MP 有一个相当奇怪的长度概念,Knuthtime在 Metafont Book 中提出了这个概念;以 MP 时间单位表示的路径长度基本上与您用来定义它的点数相同,在当前示例中为 5。因此您可以这样做:

    \begin{mplibcode}
    path P;
    P = (0,0){right} .. (2cm,4cm){up} .. (4cm,5cm){right} .. (5cm,6cm){up} .. (8cm,7cm){right};
    draw P withpen pencircle scaled 2pt withcolor .7 white;
    for t=0 upto length P: 
      drawdot point t of P withpen pencircle scaled 4pt withcolor red; 
    endfor
    \end{mplibcode}
    

    生产

    在此处输入图片描述

    但正如您所看到的,这些点在这个特定路径中并不是均匀分布的,因为它们只出现在用于指定它的五个点上。您可以有分数时间,因此您可以将循环更改为

    for t=0 step 1/4 until length P: 
      drawdot point t of P withpen pencircle scaled 4pt withcolor red; 
    endfor
    

    并得到:

    在此处输入图片描述

    但这只会使time弯曲路径上的多变性变得更加明显。

    然而,MP 提供了另外两个运算符,它们可以为您提供绝对长度,而不是time

    • arclength P返回路径的长度P(以 PostScript 点为单位)

    • arctime a of Pt返回沿路径的时间,P其中subpath (0,t) of P等于。明白了吗? arclengtha

    使用这些功能,您可以将循环的步长值设为实际长度,并用来arctime找到适当的timealong P。这样做的唯一缺点是语法变得相当繁琐。您不需要添加括号,但它们可能会使其更清晰:

    point (arctime t of P) of P
    

    这样我们就得到了顶部所示的图表,其中每隔 5 毫米有一个点P

相关内容