ntg-context - mailing list for ConTeXt users
 help / color / mirror / Atom feed
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
___________________________________________________________________________________

  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).