如何在 metapost 中制作波浪线?

如何在 metapost 中制作波浪线?

在此处输入图片描述

我可以画正常的线,但不知道如何画波浪线。

代码是这样的:

beginfig(1); 
  numeric u;
  u=1cm;
  path ytelg;
  ytelg := (0,-0.25u)--(0,3u);
  path xtelg;
  xtelg := (-0.25u,0)--(5u,0);
  drawarrow xtelg;
  drawarrow ytelg;
  path koverjoon;
  koverjoon := (0.6u,1.8u)..(1.5u,1.35u)..(2u,1.2u)..(4u,0.8u);
  draw koverjoon;
  path joon;
  joon := (0.6u,1.6u)..(0.68u,1.71u)..(0.80u,1.815u)..(0.93u,1.74u)..(0.907u,1.6u)..(0.85u,1.5u);
  path joonis;
  joonis := joon shifted(0.25u,-0.1u);
  draw joonis shifted (0.25u,-0.1u);
  draw joonis shifted (0.5u,-0.2u);
  draw joonis shifted (0.75u,-0.3u);
  path koverjoonkaks;
  koverjoonkaks := (1.85u,1.1u)..(1.94u,1.22u)..(2.06u,1.32u)..(2.22u,1.31u)..(2.25u,1.20u)..(2.25u,1.0u);
  draw koverjoonkaks shifted (0.4u,-0.1u);
  draw koverjoonkaks;
  draw koverjoonkaks shifted (0.8u,-0.2u);
  draw koverjoonkaks shifted (1.2u, -0.3u);
  draw joonis;
  draw joon;
endfig;
end

在此处输入图片描述

答案1

我不知道你到底想要什么,但你可能想要循环。下面是一个可能使用一些 MetaFun 细节的版本,但希望你能理解这个想法,并在必要时将其转换为纯 MetaPost(或使用context)。

\startMPpage[offset=1DK]

vardef tangentvector(expr pp,tt) =
  unitvector ((postcontrol tt on pp) - (precontrol tt on pp))
enddef;

vardef rightnormalvector(expr pp,tt) =
  tangentvector(pp,tt) rotated -90
enddef;

vardef leftnormalvector(expr pp,tt) =
  tangentvector(pp,tt) rotated 90
enddef;

vardef totheleft(expr pp,tt,oo) =
  point tt on pp
  shifted ((oo,0) rotated (angle leftnormalvector(pp,tt)))
enddef;

vardef totheright(expr pp,tt,oo) =
  point tt on pp 
  shifted ((oo,0) rotated (angle rightnormalvector(pp,tt)))
enddef;

vardef squigglypath(expr pp,oo,n) =
  save lp, ip ; numeric lp, ip ;
  lp := arclength(pp) ;
  for i = 0 upto (2*n) :
    hide (ip := (i/(2*n))*lp ;)
    if odd i :
      totheleft(pp,ip,oo) {tangentvector(pp,ip)} ..
    else :
      if i <> 0 :
        {rightnormalvector(pp,ip)}
      fi
      totheright(pp,ip,oo) {leftnormalvector(pp,ip)} .. 
    fi
  endfor
  nocycle
enddef;

numeric u ; u := 1cm ;
path p ; p := (.5u,3u){dir -75} .. (4u,2u) .. {dir 40}(8u,u) ;

draw p ;
draw squigglypath(subpath(0.25,1.75) of p, .15u , 15) withcolor darkred ;
drawdblarrow (0,3.5u) -- origin -- (8.5u,0) ;
\stopMPpage

运行context上面的文件我得到:

弯曲的路径

答案2

由于我对 MetaPost 的了解极其有限,因此无疑有一种更好的方法可以做到这一点。

买者自负

您可以使用nccoilnczigzag来自metaobj包的。如果您习惯使用基本的 MetaPost,语法一开始会有点尴尬。(至少,由于愚蠢的打字错误,不断出现编译错误。可能不会有这样的困难。

以下可能比您想要的更像线圈,但您可以调整和coilwidthcoilheight改变线圈的紧密度和间距。coilarmAcoilarmB在线圈开始之前确定沿曲线的长度。这些部分实际上不是弯曲的,所以我在这里把它们弄短,但如果它们不是弯曲的,控制起来似乎更容易一些0pt

如果您可以将原始路径近似为贝塞尔曲线(而不是多个连接的线段),那么您可以获得更完美的拟合,因为和都nccoil适用nczigzag于贝塞尔曲线而不是线段。

% ateb: https://tex.stackexchange.com/a/701970/ i gwestiwn hellusENG: https://tex.stackexchange.com/q/701924/
input metaobj

beginfig(3);
  numeric u;
  u=1cm;
  path ytelg;
  ytelg := (0,-0.25u)--(0,3u);
  path xtelg;
  xtelg := (-0.25u,0)--(5u,0);
  drawarrow xtelg;
  drawarrow ytelg;
  path koverjoon;
  z0=(0.6u,1.8u);
  z1=(1.5u,1.35u);
  z2=(2u,1.2u);
  z3=(4u,0.8u);
  koverjoon := z0..z1..z2..z3;
  draw koverjoon;
  nccoil(z0)(z3)"angleA(-40)","angleB(-10)",
  "coilwidth(u/10)","coilheight(1pt)","linetension(1.3)","linecolor(black)","arrows(-)","coilarmA(2.5pt)","coilarmB(2.5pt)";
endfig;
bye;

沿曲线盘绕

相关内容