下面的代码intersectiontimes
没有给出两条路径的交点。有人能提供一些关于如何找到(并标记)下面曲线交点的指导吗?(我是 metapost 新手,所以如果你想提供任何其他建议,那我也非常感谢!)
\documentclass{article}
\usepackage{luamplib}
\begin{document}
\begin{mplibcode}
gu:=1cm;
vardef j(expr t) = 2*t*t*gu enddef;
vardef g(expr t) = t*t*t*t*gu-2*t*t*gu enddef;
vardef Function(suffix f)(expr ti,tf,n) =
save fpas;
fpas := (tf-ti)/n;
(ti*gu,f(ti)) for i=1 upto n: ..(ti*gu+i*fpas*gu,f(ti+i*fpas)) endfor
enddef;
def mybox(expr l,r,t,b) =
clip currentpicture to
( (l*gu,b*gu)--(r*gu,b*gu)--(r*gu,t*gu)--(l*gu,t*gu)--cycle)
enddef;
beginfig(1);
a = -4;
b = 4;
path p;
p = Function(j,a,b,200);
path q;
q = Function(g,a,b,200);
draw p
yscaled .15
xscaled .7
withpen pencircle scaled .5;
draw q
yscaled .15
xscaled .7
withpen pencircle scaled .5;
fill buildcycle(reverse(q),p) xscaled .7 yscaled .15 withcolor .7red;
drawdblarrow ((-2,0)*gu--(2,0)*gu);
drawdblarrow ((0,-1)*gu--(0,3)*gu) xscaled .7 yscaled .8;
z1 = (p yscaled .15 xscaled .7) intersectiontimes (q yscaled .15 xscaled .7);
dotlabel.lft("x",z1);
mybox(-2,2,-1,2.5);
endfig;
end
\end{mplibcode}
\end{document}
答案1
你需要intersectionpoint
;如果我改变行
z1 = (p yscaled .15 xscaled .7) intersectiontimes (q yscaled .15 xscaled .7);
进入
z1 = (p yscaled .15 xscaled .7) intersectionpoint (q yscaled .15 xscaled .7);
我明白了
该基元intersectiontimes
返回一对,但其组成部分是两个“时间”:(t1,t2)
,其中t1
和t2
是两条路径相交的时间;因此它不打算用作点。相反,intersectionpoint
返回相同交点的坐标。
关于交点的规则在 Metapost 手册第 9.2 节和 METAFONTbook 第 5 章中列出。在这种情况下,你可以使用
p' = p yscaled .15 xscaled .7; % a couple of shortcuts
q' = q yscaled .15 xscaled .7;
z1 = p' intersectionpoint q'; % find the first intersection
dotlabel.lft("x",z1);
pair meet;
meet = p' intersectiontimes q';
p' := subpath (eps+xpart meet,infinity) of p'; % cut the paths
q' := subpath (eps+ypart meet,infinity) of q';
z2 = p' intersectionpoint q'; % find the second intersection
dotlabel.bot("y",z2);
z3 = (reverse p') intersectionpoint (reverse q'); % find the third intersection
dotlabel.lft("z",z3);
用找到 (0,0) 的时间再多走一点的技巧对于找到第三个点不起作用,因为它在一条曲线上是最小值,在另一条曲线上是最大值。但反转路径是可行的。然而,找到的对称点当然会更简单z1
。