On 21 Apr 2020, at 14:41, Hans Hagen
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)? G 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.