On 21 Apr 2020, at 14:41, Hans Hagen <j.hagen@xs4all.nl> wrote:

On 4/21/2020 1:29 PM, Gerben Wierda wrote:
[snip]

\startMPpage[instance=doublefun]

path arrowHead;
arrowHead :=
   (542,-77.000186920166016)..controls (545.33333333333337,-77.000186920166016) and
   (548.66666666666663,-77.000186920166016) ..(552,-77.000186920166016)..controls
   (550.33333333333337,-73.666853586832687) and
   (548.66666666666663,-70.333520253499344) ..(547,-67.000186920166016)..controls
   (545.33333333333337,-70.333520253499344) and
   (543.66666666666663,-73.666853586832687) ..cycle;

path connection;
connection :=
 (420.00004959106445,-367)..controls (420.66670256708773,-367) and
 (421.333355543111,-367) ..(422.00000851913427,-367)..controls
 (425.33333917170194,-367) and (428.6666698242696,-367)
 ..(432.00000047683727,-367)..controls (442.00000015894574,-367) and
 (451.99999984105426,-367) ..(461.99999952316273,-367)..controls
 (464.76142345324098,-367) and (467,-364.76142382108867)
 ..(467,-361.99999997656772)..controls (467,-293.99999999218926) and
 (467,-226.00000000781074) ..(467,-158.00000002343228)..controls
 (467,-155.23857623850762) and (469.23857634039018,-153)
 ..(472.00000014901161,-153)..controls (495.33333338300389,-153) and
 (518.66666661699617,-153) ..(541.99999985098839,-153)..controls
 (544.76142368504975,-153) and (547,-150.76142367339932)
 ..(547,-147.99999983662815)..controls (547,-125.99999994554271) and
 (547,-104.00000005445727) ..(547,-82.000000163371837)..controls
 (547,-78.666668047283764) and (547,-75.333335931195691)
 ..(547,-72.000003815107618)..controls (547,-70.333398183460417) and
 (547,-68.666792551813217) ..(547,-67.000186920166016);

pair a ; a := arrowHead intersection_point connection ;

draw connection cutafter arrowHead           withcolor red   withpen pencircle scaled 2mm ;
draw connection cutafter (reverse arrowHead) withcolor green withpen pencircle scaled 1mm ;

draw arrowHead;

draw a withcolor blue withpen pencircle scaled 3mm ;

currentpicture := currentpicture shifted (-bbwidth(currentpicture), 0) ;

draw connection cutafter a ;

draw arrowHead;


\stopMPpage

Hi Hans, thanks.

I am completely in the dark why your intersection_point works (and thus if it will keep working in all circumstances).

I’d like to understand what is going on here. Why does intersection_point work where cutafter does not? After all, both are based on the same intersectiontimes primitive to find the intersection and they should thus find the same one: the ’perfect’ intersection which is the end point of the path that is to be cut. 

I’d like to understand this, because otherwise I might run into the same problem again later with slightly different paths involved. The first algo that I was using worked fine in most cases, as well, then I created one that worked with paths with ‘internal spikes’ and now I run into this where two comparable situations behaved differently and my question copied the one that didn’t work. And while this example from you works, I need to have something that is 100% reliable.

What METAPOST comes with is:

path cuttings;  % what got cut off

tertiarydef a cutbefore b =  % tries to cut as little as possible
  begingroup save t;
  (t, whatever) = a intersectiontimes b;
  if t<0:
    cuttings:=point 0 of a;
    a
  else: cuttings:= subpath (0,t) of a;
    subpath (t,length a) of a
  fi
  endgroup
enddef;

tertiarydef a cutafter b =
  reverse (reverse a  cutbefore  b)
  hide(cuttings:=reverse cuttings)
enddef;

secondarydef p intersectionpoint q =
 begingroup save x_,y_; (x_,y_)=p intersectiontimes q;
 if x_<0: errmessage("The paths don't intersect"); origin
 else: .5[point x_ of p, point y_ of q] fi endgroup
enddef;

What is in MetaFun is:

boolean intersection_found ;

secondarydef p intersection_point q =
    begingroup
    save x_, y_ ;
    (x_,y_) = p intersectiontimes q ;
    if x_< 0 :
        intersection_found := false ;
        center p % origin
    else :
        intersection_found := true ;
        .5[point x_ of p, point y_ of q]
    fi
    endgroup
enddef ;

The thing I can think of is cutting a bit, trying if it still intersects and if it does repeat and if it doesn’t take the previous result. I can’t rely on the length of cuttings being 0, because this is true in the case of no intersection (cuttings equals (0,0)) as well as a ‘perfect’ intersection at the end of the path (cuttings is the point at the end of the path). I could rely on cuttings being the path (0,0) but how do I compare paths (and not pairs)?


Pretty deep into MP now. Even looked up the reference in John Hobby’s manual to the METAFONT book, but that reference did not help.