From: Gerben Wierda <gerben.wierda@rna.nl>
To: Hans Hagen <j.hagen@xs4all.nl>
Cc: mailing list for ConTeXt users <ntg-context@ntg.nl>
Subject: Re: METAPOST: How do I get this 'max' cutafter to work?
Date: Tue, 21 Apr 2020 17:52:13 +0200 [thread overview]
Message-ID: <1176DF5F-7B16-46A9-8ACE-496EB0E0F2C4@rna.nl> (raw)
In-Reply-To: <4d3f3d4b-21b5-a05c-1c11-6f822b1e566b@xs4all.nl>
[-- Attachment #1.1: Type: text/plain, Size: 4923 bytes --]
> 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)?
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.
[-- Attachment #1.2: Type: text/html, Size: 15475 bytes --]
[-- Attachment #2: Type: text/plain, Size: 493 bytes --]
___________________________________________________________________________________
If your question is of interest to others as well, please add an entry to the Wiki!
maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
webpage : http://www.pragma-ade.nl / http://context.aanhet.net
archive : https://bitbucket.org/phg/context-mirror/commits/
wiki : http://contextgarden.net
___________________________________________________________________________________
next prev parent reply other threads:[~2020-04-21 15:52 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-04-21 11:29 Gerben Wierda
2020-04-21 12:41 ` Hans Hagen
2020-04-21 15:52 ` Gerben Wierda [this message]
2020-04-21 16:25 ` Hans Hagen
2020-04-22 7:30 ` Taco Hoekwater
2020-04-22 8:17 ` luigi scarso
2020-04-22 20:12 ` Gerben Wierda
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1176DF5F-7B16-46A9-8ACE-496EB0E0F2C4@rna.nl \
--to=gerben.wierda@rna.nl \
--cc=j.hagen@xs4all.nl \
--cc=ntg-context@ntg.nl \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).