> On 12 Feb 2021, at 10:31, Mikael Sundqvist <mic...@gmail.com> wrote:
> 
> Hi Taco,
> 
> thanks, from your observation and the way I build the paths, I found
> out that I can avoid the problem by shortening the paths I join just
> slightly:
> 
> cl := (fullcircle scaled 4u) shifted z0;
> cl := cl cutbefore point (1/6+epsilon) along cl cutafter point
> (2/6-epsilon) along cl;
> cs := (fullcircle scaled 16u) shifted z1;
> cs := cs cutafter point (1/6-epsilon) along cs;
> 
> and indeed, it works here now, with different values of the scale u,
> and it seems more stable.


Here is a quick hack I wrote that does the cleanup in a postprocessing stage. 
It is not very generic or clever, but it works for your case:

def clean_path(suffix p) =
  begingroup;
  save q,precontrols,postcontrols,points, skip, i,j;
  boolean skip;
  pair precontrols[],postcontrols[],points[] ;
  j := 0;
  for i = 0 upto length p:
    skip := false;
    if abs(xpart point i of p - xpart point i+1 of p)<0.01:
       if abs(ypart point i of p - ypart point i+1 of p)<0.01:
         skip := true;
       fi
    fi
    if not skip:
       points[j] := point i of p;
       postcontrols[j] := postcontrol i of p;
       precontrols[j+1] := precontrol i+1 of p;
       j := j + 1;
    fi
  endfor;
  if abs(xpart point 0 of p - xpart point length p of p)<0.01:
     if abs(ypart point 0 of p - ypart point length p of p)<0.01:
       j := j - 1;
     fi
  fi
  p := for i=0 upto j-1: points[i] .. controls postcontrols[i] and 
precontrols[i+1] .. endfor cycle;
  endgroup;
enddef;

show p0;
clean_path(p0);
show p0;

> 
> PS I found out that eps and epsilon both worked, and I do not see in
> the metafun manual if there is a difference.

The original intent was for eps to be just a ’small enough value that a human 
will not notice it’ where epsilon is intended as ’the smallest representable 
value’. Neither really work that way because depending on how you use metapost 
eps can be quite visible (especially in non-scaled number systems) and (more 
importantly) in the new non-scaled number systems epsilon cannot really be the 
smallest representable value for numerical and practical reasons.

So in reality, we always use these definitions:

  eps      := .00049 ;      % this is a pretty small positive number
  epsilon  := 1/256/256 


Best wishes,
Taco

— 
Taco Hoekwater              E: t...@bittext.nl
genderfluid (all pronouns)



___________________________________________________________________________________
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 via email to