Metapost 交叉时间

Metapost 交叉时间

下面的代码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),其中t1t2是两条路径相交的时间;因此它不打算用作点。相反,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

相关内容