Dear Mikael, > Le 20 déc. 2021 à 12:14, Mikael Sundqvist <mic...@gmail.com> a écrit : > > Hi, > > I will try again. What if you do > > newcircleA := newcircleA scrutinized 2; > > after your definition of newcircleA?
Once I understood I had to compile with LMTX, this works like magic ! I spent hours to find a solution… but here is a solution ! Thanks a lot ! > > /Mikael Fabrice. > > > On Mon, Dec 20, 2021 at 3:45 PM Fabrice L <fabrice.al...@gmail.com> wrote: >> >> Thanks Mikael, >> >> Le 20 déc. 2021 à 02:21, Mikael Sundqvist via ntg-context >> <ntg-context@ntg.nl> a écrit : >> >> Hi, >> >> would it be an option for you to do >> >> newcircleA := circleA cutbefore P1 cutafter P2 -- cycle ; >> >> In that case you avoid extra points. >> >> >> You are right, in this simple case, your solution avoid the problem, and is >> applicable in some of my cases (I have to rethink the code). Thanks for the >> proposition ! >> But in others cases this is not possible (I think). Imagine I wish to do a « >> partial moon » from the two circles in my minimal example (see bottom right >> of the attached pdf): >> >> >> newcircleA := circleA cutbefore P1 cutafter P2 .. reverse(circleB cutbefore >> P1 cutafter P2) .. cycle; >> >> I need 10 points to define the shape, but as my connections are duplicated, >> I have 12 points. >> >> The solution (I thought) would be to use the « & » operator : >> newcircleA := circleA cutbefore P1 cutafter P2 & reverse(circleB cutbefore >> P1 cutafter P2) & cycle ; >> >> But this does not work (same reason as before: "! Paths don't touch; `&' >> will be changed to `..'."). >> >> The compete minimal code (if somebody wants to plus with it) is here : >> >> % ——————————————————————— >> \startMPpage >> path circleA , circleB ; >> pair P[]; >> defaultscale := 0.4 ; >> >> circleA := fullcircle scaled 1in randomized 3 ; >> circleB := fullcircle scaled 1in randomized 3 shifted(0.3in,0.3in) ; >> >> draw circleA withcolor blue ; >> draw circleB withcolor red ; >> >> P[1] := circleA intersectionpoint circleB ; >> dotlabel.lft("$P_1$",P[1]) ; >> dotlabel.rt("$\blue\tfx P_0^A$",point 0 of circleA) ; >> P[2] := reverse(circleA) intersectionpoint circleB ; >> dotlabel.rt("$P_2$",P[2]) ; >> dotlabel.rt("$\red\tfx P_0^B$",point 0 of circleB) ; >> >> path newcircleA , newcircleB ; >> % newcircleA := (circleA cutbefore P1 cutafter P2 ) & (P2 -- P1) & cycle ; >> % previous line gives an error : >> % "! Paths don't touch; `&' will be changed to `..'." >> newcircleA := circleA cutbefore P1 cutafter P2 -- (P2 -- P1) -- cycle ; >> newcircleA := newcircleA xshifted 2in ; >> draw newcircleA withcolor darkgreen ; >> >> newcircleB := (circleB cutafter P1) -- (P1 -- P2) -- (circleB cutbefore P2 >> ) & cycle ; >> newcircleB := newcircleB xshifted 2in ; >> draw newcircleB withcolor black ; >> drawpoints newcircleA ; drawpointlabels newcircleA ; >> >> % Mikael solution >> newcircleA := circleA cutbefore P1 cutafter P2 -- cycle ; >> newcircleA := newcircleA yshifted -1.5in ; >> draw newcircleA withcolor darkgreen ; >> drawpoints newcircleA ; drawpointlabels newcircleA ; >> >> % partial moon >> newcircleA := circleA cutbefore P1 cutafter P2 >> .. reverse(circleB cutbefore P1 cutafter P2) .. cycle; >> % & (reverse(circleB) cutbefore P2 cutafter P1) & cycle; >> newcircleA := newcircleA shifted(2in,-1.5in) ; >> draw newcircleA withcolor magenta ; >> drawpoints newcircleA ; drawpointlabels newcircleA ; >> >> \stopMPpage >> % ——————————————————————— >> >> Thanks for any help ! >> Fabrice. >> >> >> /Mikael >> >> On Mon, Dec 20, 2021 at 5:30 AM Fabrice L via ntg-context >> <ntg-context@ntg.nl> wrote: >> >> >> Dear list, >> >> I have a problem connecting path with the operator « & » (page 16 Metafun >> manual). The problem is illustrated by the code (and the joined PDF) which >> follows. >> >> I draw random cycled forms (left part of the figure) and when they >> interact, they are modified to « fit together » (right part of the figure) . >> When building these new forms, I connect paths (usually two or three >> depending on position 0 of the path); the last point a path is the same as >> the first point of the next path ; for exemple, to modify the blue circle, >> named « circleA », I take the circle A from P1 to P2, then a segment from P2 >> to P1 and cycle to have a closed path. So I should be able to do : >> >> newcircleA := circleA cutbefore P1 cutafter P2 & (P2 -- P1) & cycle ; >> >> The « & » operator is supposed to work (if I understand correctly) in this >> case, but I have this error message : >> >> "! Paths don't touch; `&' will be changed to `..’." >> >> Which I do not understand since the paths « touch ». There was a similar >> question last year, without a clear answer (« >> METAPOST subpath rounding issue >> »https://www.mail-archive.com/ntg-context@ntg.nl/msg94294.html). >> >> A solution is to ignore the repeating points : >> newcircleA := circleA cutbefore P1 cutafter P2 -- (P2 -- P1) -- cycle ; >> but this new shape has 9 points instead of 7. The problem is that I do these >> operations a number of times, and the length of a path (in the number of >> points) is increasing and cause trouble when I look for intersections with >> others shapes. >> >> Here is the MWE: >> >> \startMPpage >> path circleA , circleB ; >> pair P[]; >> >> circleA := fullcircle scaled 1in randomized 3 ; >> circleB := fullcircle scaled 1in randomized 3 shifted(0.3in,0.3in) ; >> >> draw circleA withcolor blue ; >> draw circleB withcolor red ; >> >> P[1] := circleA intersectionpoint circleB ; >> dotlabel.lft("$P_1$",P[1]) ; >> dotlabel.rt("$\blue\tfx P_0^A$",point 0 of circleA) ; >> P[2] := reverse(circleA) intersectionpoint circleB ; >> dotlabel.rt("$P_2$",P[2]) ; >> dotlabel.rt("$\red\tfx P_0^B$",point 0 of circleB) ; >> >> path newcircleA , newcircleB ; >> % newcircleA := circleA cutbefore P1 cutafter P2 & (P2 -- P1) & cycle ; >> % previous line gives an error : >> % "! Paths don't touch; `&' will be changed to `..'." >> newcircleA := circleA cutbefore P1 cutafter P2 -- (P2 -- P1) -- cycle ; >> newcircleA := newcircleA xshifted 2in ; >> draw newcircleA withcolor darkgreen ; >> >> newcircleB := (circleB cutafter P1) -- (P1 -- P2) -- (circleB cutbefore P2 >> ) & cycle ; >> newcircleB := newcircleB xshifted 2in ; >> draw newcircleB withcolor black ; >> drawpoints newcircleA ; drawpointlabels newcircleA ; >> >> \stopMPpage >> >> >> >> >> I would appreciate any help ! Thanks ! >> Fabrice. >> >> ___________________________________________________________________________________ >> 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 >> ___________________________________________________________________________________ >> >> ___________________________________________________________________________________ >> 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 >> ___________________________________________________________________________________ >> >> ___________________________________________________________________________________ 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 ___________________________________________________________________________________