我可以画正常的线,但不知道如何画波浪线。
代码是这样的:
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 的了解极其有限,因此无疑有一种更好的方法可以做到这一点。
买者自负
您可以使用nccoil
或nczigzag
来自metaobj
包的。如果您习惯使用基本的 MetaPost,语法一开始会有点尴尬。(至少,我由于愚蠢的打字错误,不断出现编译错误。你可能不会有这样的困难。
以下可能比您想要的更像线圈,但您可以调整和coilwidth
来coilheight
改变线圈的紧密度和间距。coilarmA
并coilarmB
在线圈开始之前确定沿曲线的长度。这些部分实际上不是弯曲的,所以我在这里把它们弄短,但如果它们不是弯曲的,控制起来似乎更容易一些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;