From mboxrd@z Thu Jan 1 00:00:00 1970 X-Msuck: nntp://news.gmane.io/gmane.comp.tex.context/113825 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Fabrice L via ntg-context Newsgroups: gmane.comp.tex.context Subject: Re: MP: problem connecting paths. Date: Mon, 20 Dec 2021 09:45:18 -0500 Message-ID: <980A36CC-5A6A-4235-8D09-3A45C583BFA2@gmail.com> References: <694BE441-A172-40EC-8365-3489BA0ADCE9@gmail.com> Reply-To: mailing list for ConTeXt users Mime-Version: 1.0 (Mac OS X Mail 15.0 \(3693.40.0.1.81\)) Content-Type: multipart/mixed; boundary="===============2940633188104453712==" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="12709"; mail-complaints-to="usenet@ciao.gmane.io" Cc: Fabrice L , Mikael Sundqvist To: mailing list for ConTeXt users Original-X-From: ntg-context-bounces@ntg.nl Mon Dec 20 15:46:09 2021 Return-path: Envelope-to: gctc-ntg-context-518@m.gmane-mx.org Original-Received: from zapf.boekplan.nl ([5.39.185.232] helo=zapf.ntg.nl) by ciao.gmane.io with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1mzJvV-0002rj-FM for gctc-ntg-context-518@m.gmane-mx.org; Mon, 20 Dec 2021 15:46:09 +0100 Original-Received: from localhost (localhost [127.0.0.1]) by zapf.ntg.nl (Postfix) with ESMTP id 7E043286D5A; Mon, 20 Dec 2021 15:45:29 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at zapf.boekplan.nl Original-Received: from zapf.ntg.nl ([127.0.0.1]) by localhost (zapf.ntg.nl [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id t4mP8fAje76X; Mon, 20 Dec 2021 15:45:27 +0100 (CET) Original-Received: from zapf.ntg.nl (localhost [127.0.0.1]) by zapf.ntg.nl (Postfix) with ESMTP id 441E7286CFF; Mon, 20 Dec 2021 15:45:27 +0100 (CET) Original-Received: from localhost (localhost [127.0.0.1]) by zapf.ntg.nl (Postfix) with ESMTP id 85746286CFF for ; Mon, 20 Dec 2021 15:45:24 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at zapf.boekplan.nl Original-Received: from zapf.ntg.nl ([127.0.0.1]) by localhost (zapf.ntg.nl [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 6DDhD46TUhyj for ; Mon, 20 Dec 2021 15:45:23 +0100 (CET) Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=209.85.160.182; helo=mail-qt1-f182.google.com; envelope-from=fabrice.alpha@gmail.com; receiver= Original-Received: from mail-qt1-f182.google.com (mail-qt1-f182.google.com [209.85.160.182]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by zapf.ntg.nl (Postfix) with ESMTPS id D36D2286B0A for ; Mon, 20 Dec 2021 15:45:22 +0100 (CET) Original-Received: by mail-qt1-f182.google.com with SMTP id n15so9991840qta.0 for ; Mon, 20 Dec 2021 06:45:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:message-id:mime-version:subject:date:in-reply-to:cc:to :references; bh=jv3v8h7eq8f99QfEXe1Z3AbWirOBHQNI6HM5yojMd0s=; b=QC+5cEcHuiff1tbZw/5LECqcaOGHSyIMoFXWgXxncQ8NKg1pPpHDuLk+YCuQBfDnk3 UiWKTYPvtFsq+N5v81jO0ITItRId3lkzurIxE4giqcI0VXaz/rqz9nQvlxG2AXhdcrdL 7WbhaV8rVBMt4idAtTP7LPBAu43u+cMlI/W8i6lEY5Wkfsn4c4zG0RvlD17xzYdLbRW3 HbCMGPGdYKXhupje5kjL2atOhlJ3nUlHHT8i//s0ZBTU9LA5wvdZCrIqEShU4js7tnjM QfYHIez7ezcqEMnKB3BMjFLPzSRHtWQW6xlY+5thFsrEzdXjNV1QJJ2vp1CPyu5T8Z6T //AA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:message-id:mime-version:subject:date :in-reply-to:cc:to:references; bh=jv3v8h7eq8f99QfEXe1Z3AbWirOBHQNI6HM5yojMd0s=; b=gB8JdyHUmKopJJMz1ct+xxZg3T/PPO9QFypD4O8Jzbk5MTZrCAyHWhWDtMQf+wpk6i 8kPA44yVK/ZSPRqt2mu1Fi+0qvtt+F5PlyvkdFby1V7i9gtJFF2YOVlSfMjeR+ymGkSG EQgdIQ1/4x+IFL7yTtkEGIfGcNBlW051WzH2d6yRQM03nbOq7tKeyvk2H9/+ZWkozzMb NJN7aajhaN8CjfmfYCBB7NWM+JWtpQZKQP6AY6S3F0sLaLa4gyEcdroym/cqy9VqoFi+ cxqxK8TjUzy1/NKrjPGU3ltv2+ZPTE+hOXfoDliXvvlLhuxuSBE36gjPjCWhsy3r8r4/ iL2Q== X-Gm-Message-State: AOAM530X7QxPy8EtY04CZDBDo+AGKH+IANZKqXQRhw5zJvxOghslHAvM 8FIRyEM5fUzCQhVOKaEaqdu9JYwBnf7e3Q== X-Google-Smtp-Source: ABdhPJzDVDpsdaTSOPAnNfI1s0u2zulDYgUd11I6c0yybF+pQx2bCPsYLMz1TiqWSnDumRl1Xw+Ftg== X-Received: by 2002:a05:622a:512:: with SMTP id l18mr12792585qtx.120.1640011520939; Mon, 20 Dec 2021 06:45:20 -0800 (PST) Original-Received: from smtpclient.apple ([38.74.28.141]) by smtp.gmail.com with ESMTPSA id 2sm11091622qkr.126.2021.12.20.06.45.19 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Mon, 20 Dec 2021 06:45:19 -0800 (PST) In-Reply-To: X-Mailer: Apple Mail (2.3693.40.0.1.81) X-BeenThere: ntg-context@ntg.nl X-Mailman-Version: 2.1.26 Precedence: list List-Id: mailing list for ConTeXt users List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: ntg-context-bounces@ntg.nl Original-Sender: "ntg-context" Xref: news.gmane.io gmane.comp.tex.context:113825 Archived-At: --===============2940633188104453712== Content-Type: multipart/alternative; boundary="Apple-Mail=_831C311D-634E-4893-98EB-B5D024273ED5" --Apple-Mail=_831C311D-634E-4893-98EB-B5D024273ED5 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 Thanks Mikael, > Le 20 d=C3=A9c. 2021 =C3=A0 02:21, Mikael Sundqvist via ntg-context = a =C3=A9crit : >=20 > Hi, >=20 > would it be an option for you to do >=20 > newcircleA :=3D circleA cutbefore P1 cutafter P2 -- cycle ; >=20 > 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 !=20 But in others cases this is not possible (I think). Imagine I wish to do = a =C2=AB partial moon =C2=BB from the two circles in my minimal example = (see bottom right of the attached pdf):=20 newcircleA :=3D circleA cutbefore P1 cutafter P2 .. reverse(circleB = cutbefore P1 cutafter P2) .. cycle;=20 I need 10 points to define the shape, but as my connections are = duplicated, I have 12 points.=20 The solution (I thought) would be to use the =C2=AB & =C2=BB operator : newcircleA :=3D circleA cutbefore P1 cutafter P2 & reverse(circleB = cutbefore P1 cutafter P2) & cycle ;=20 But this does not work (same reason as before: "! Paths don't touch; `&' = will be changed to `..'.").=20 The compete minimal code (if somebody wants to plus with it) is here : % =E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94= =E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2= =80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94 \startMPpage path circleA , circleB ; pair P[]; defaultscale :=3D 0.4 ; circleA :=3D fullcircle scaled 1in randomized 3 ; circleB :=3D fullcircle scaled 1in randomized 3 shifted(0.3in,0.3in) ; draw circleA withcolor blue ; draw circleB withcolor red ; P[1] :=3D circleA intersectionpoint circleB ; dotlabel.lft("$P_1$",P[1]) ; dotlabel.rt("$\blue\tfx P_0^A$",point 0 of circleA) ; P[2] :=3D 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 :=3D (circleA cutbefore P1 cutafter P2 ) & (P2 -- P1) & = cycle ; % previous line gives an error : % "! Paths don't touch; `&' will be changed to `..'." newcircleA :=3D circleA cutbefore P1 cutafter P2 -- (P2 -- P1) -- cycle = ; newcircleA :=3D newcircleA xshifted 2in ; draw newcircleA withcolor darkgreen ; newcircleB :=3D (circleB cutafter P1) -- (P1 -- P2) -- (circleB = cutbefore P2 ) & cycle ;=20 newcircleB :=3D newcircleB xshifted 2in ; draw newcircleB withcolor black ; drawpoints newcircleA ; drawpointlabels newcircleA ; % Mikael solution=20 newcircleA :=3D circleA cutbefore P1 cutafter P2 -- cycle ; newcircleA :=3D newcircleA yshifted -1.5in ; draw newcircleA withcolor darkgreen ; drawpoints newcircleA ; drawpointlabels newcircleA ; % partial moon=20 newcircleA :=3D circleA cutbefore P1 cutafter P2=20 .. reverse(circleB cutbefore P1 cutafter P2) .. cycle;=20 % & (reverse(circleB) cutbefore P2 cutafter P1) & cycle;=20 newcircleA :=3D newcircleA shifted(2in,-1.5in) ; draw newcircleA withcolor magenta ; drawpoints newcircleA ; drawpointlabels newcircleA ; \stopMPpage % =E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94= =E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2= =80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94 Thanks for any help !=20 Fabrice. >=20 > /Mikael >=20 > On Mon, Dec 20, 2021 at 5:30 AM Fabrice L via ntg-context > wrote: >>=20 >> Dear list, >>=20 >> I have a problem connecting path with the operator =C2=AB & =C2=BB = (page 16 Metafun manual). The problem is illustrated by the code (and = the joined PDF) which follows. >>=20 >> I draw random cycled forms (left part of the figure) and when they = interact, they are modified to =C2=AB fit together =C2=BB (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 =C2=AB circleA =C2=BB, 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 : >>=20 >> newcircleA :=3D circleA cutbefore P1 cutafter P2 & (P2 -- P1) & cycle = ; >>=20 >> The =C2=AB & =C2=BB operator is supposed to work (if I understand = correctly) in this case, but I have this error message : >>=20 >> "! Paths don't touch; `&' will be changed to `..=E2=80=99." >>=20 >> Which I do not understand since the paths =C2=AB touch =C2=BB. There = was a similar question last year, without a clear answer (=C2=AB >> METAPOST subpath rounding issue = =C2=BBhttps://www.mail-archive.com/ntg-context@ntg.nl/msg94294.html). >>=20 >> A solution is to ignore the repeating points : >> newcircleA :=3D 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. >>=20 >> Here is the MWE: >>=20 >> \startMPpage >> path circleA , circleB ; >> pair P[]; >>=20 >> circleA :=3D fullcircle scaled 1in randomized 3 ; >> circleB :=3D fullcircle scaled 1in randomized 3 shifted(0.3in,0.3in) = ; >>=20 >> draw circleA withcolor blue ; >> draw circleB withcolor red ; >>=20 >> P[1] :=3D circleA intersectionpoint circleB ; >> dotlabel.lft("$P_1$",P[1]) ; >> dotlabel.rt("$\blue\tfx P_0^A$",point 0 of circleA) ; >> P[2] :=3D reverse(circleA) intersectionpoint circleB ; >> dotlabel.rt("$P_2$",P[2]) ; >> dotlabel.rt("$\red\tfx P_0^B$",point 0 of circleB) ; >>=20 >> path newcircleA , newcircleB ; >> % newcircleA :=3D circleA cutbefore P1 cutafter P2 & (P2 -- P1) & = cycle ; >> % previous line gives an error : >> % "! Paths don't touch; `&' will be changed to `..'." >> newcircleA :=3D circleA cutbefore P1 cutafter P2 -- (P2 -- P1) -- = cycle ; >> newcircleA :=3D newcircleA xshifted 2in ; >> draw newcircleA withcolor darkgreen ; >>=20 >> newcircleB :=3D (circleB cutafter P1) -- (P1 -- P2) -- (circleB = cutbefore P2 ) & cycle ; >> newcircleB :=3D newcircleB xshifted 2in ; >> draw newcircleB withcolor black ; >> drawpoints newcircleA ; drawpointlabels newcircleA ; >>=20 >> \stopMPpage >>=20 >>=20 >>=20 >>=20 >> I would appreciate any help ! Thanks ! >> Fabrice. >>=20 >> = __________________________________________________________________________= _________ >> If your question is of interest to others as well, please add an = entry to the Wiki! >>=20 >> 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! >=20 > 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 > = __________________________________________________________________________= _________ --Apple-Mail=_831C311D-634E-4893-98EB-B5D024273ED5 Content-Type: multipart/mixed; boundary="Apple-Mail=_24F42C41-1825-4224-A4AD-E8391E9F6E74" --Apple-Mail=_24F42C41-1825-4224-A4AD-E8391E9F6E74 Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset=utf-8 Thanks Mikael,

Le 20 d=C3=A9c. 2021 =C3=A0 = 02:21, Mikael Sundqvist via ntg-context <ntg-context@ntg.nl> = a =C3=A9crit :

Hi,

would it be = an option for you to do

newcircleA :=3D = 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 =C2=AB partial = moon =C2=BB from the two circles in my minimal example (see bottom = right of the attached pdf): 

= --Apple-Mail=_24F42C41-1825-4224-A4AD-E8391E9F6E74 Content-Disposition: inline; filename=test.pdf Content-Type: application/pdf; x-unix-mode=0644; name="test.pdf" Content-Transfer-Encoding: base64 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 yUO5uAw6zp3sz5GMt63s+9Lxpjd9mJA3az8mJV8xeSgnlwRmaWNLVGT8tRmLj588a/rYFFKNlbmt o2J4bX3LR3Xy7eEdTex288f989rDbvE4qm1IUlYSCsmxJFGS8etedeNTdbFJWsicJLcqkdzEtZt9 BT6HmEjEelHjWLHs9LCbtXX3l7SwF1Q2oByCSQ5O1Ysp4tKjp4nNfPuTSkUyAezn9JUKOFnqYbly JaGXSq2dz1eXctuuh71ZW3d/XCorIhtADoGkXmo9g2uSm0t/b+6oPKVyLlP4MgQutS35kOxIIEuR RAhKG1e+Gp1RdF/tv+Nbly5bP45hBWODxSGGUkmJpdqS6D0buxhIShrJRr6Suzaay5fH09CpfMh9 14QpxVm+lKTGcZbPavk049BA6koiH+dmxUhq7YBR8+kM5y5HtCfIOD0DBMzy3z+cu6DSgnKMJb1E vpGWdqgfI2DOen2B5X7IdIPlvQO7KI3DMmJGKIHxGc4dMllJKkUDZ2dkd78eO7WF866RXeksFmBa XK7B+Wr//zHw068/nv4PG9eexAplbmRzdHJlYW0KZW5kb2JqCjEwIDAgb2JqCjw8IC9TdWJ0eXBl IC9YTUwgL1R5cGUgL01ldGFkYXRhIC9MZW5ndGggMjAzNiA+PiAgICAgICAKc3RyZWFtCjw/eHBh Y2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+PHg6eG1wbWV0 YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyI+PHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3 LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj48cmRmOkRlc2NyaXB0aW9uIHJkZjph Ym91dD0iIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPjxkYzpm b3JtYXQ+YXBwbGljYXRpb24vcGRmPC9kYzpmb3JtYXQ+PGRjOmNyZWF0b3I+PHJkZjpTZXE+PHJk ZjpsaSB4bWw6bGFuZz0ieC1kZWZhdWx0Ii8+PC9yZGY6U2VxPjwvZGM6Y3JlYXRvcj48ZGM6ZGVz Y3JpcHRpb24+PHJkZjpBbHQ+PHJkZjpsaSB4bWw6bGFuZz0ieC1kZWZhdWx0Ii8+PC9yZGY6QWx0 PjwvZGM6ZGVzY3JpcHRpb24+PGRjOnRpdGxlPjxyZGY6QWx0PjxyZGY6bGkgeG1sOmxhbmc9Ingt ZGVmYXVsdCI+dGVzdDwvcmRmOmxpPjwvcmRmOkFsdD48L2RjOnRpdGxlPjwvcmRmOkRlc2NyaXB0 aW9uPjxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnBkZng9Imh0dHA6Ly9ucy5h ZG9iZS5jb20vcGRmeC8xLjMvIj48cGRmeDpJRD50ZXN0IHwgMjAyMS0xMi0yMFQwOTo0MzozMy0w NTowMDwvcGRmeDpJRD48cGRmeDpDb25UZVh0LkpvYm5hbWU+dGVzdDwvcGRmeDpDb25UZVh0Lkpv Ym5hbWU+PHBkZng6Q29uVGVYdC5UaW1lPjIwMjEtMTItMjAgMDk6NDM8L3BkZng6Q29uVGVYdC5U aW1lPjxwZGZ4OkNvblRlWHQuVXJsPnd3dy5wcmFnbWEtYWRlLmNvbTwvcGRmeDpDb25UZVh0LlVy bD48cGRmeDpDb25UZVh0LlN1cHBvcnQ+Y29udGV4dGdhcmRlbi5uZXQ8L3BkZng6Q29uVGVYdC5T dXBwb3J0PjxwZGZ4OkNvblRlWHQuVmVyc2lvbj4yMDIxLjEyLjEwIDExOjQxPC9wZGZ4OkNvblRl WHQuVmVyc2lvbj48cGRmeDpDb25UZVh0LkxNVFgvPjxwZGZ4OlRlWC5TdXBwb3J0PnR1Zy5vcmc8 L3BkZng6VGVYLlN1cHBvcnQ+PHBkZng6THVhVGVYLlZlcnNpb24+MS4xMzwvcGRmeDpMdWFUZVgu VmVyc2lvbj48cGRmeDpMdWFUZVguRnVuY3Rpb25hbGl0eT43NDIwPC9wZGZ4Okx1YVRlWC5GdW5j dGlvbmFsaXR5PjxwZGZ4Okx1YVRlWC5MdWFWZXJzaW9uPjUuMzwvcGRmeDpMdWFUZVguTHVhVmVy c2lvbj48cGRmeDpMdWFUZVguUGxhdGZvcm0+b3N4LTY0PC9wZGZ4Okx1YVRlWC5QbGF0Zm9ybT48 L3JkZjpEZXNjcmlwdGlvbj48cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9 Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iPjx4bXA6Q3JlYXRlRGF0ZT4yMDIxLTEyLTIw VDA5OjQzOjMzLTA1OjAwPC94bXA6Q3JlYXRlRGF0ZT48eG1wOkNyZWF0b3JUb29sPkx1YVRlWCAx LjEzIDc0MjAgKyBDb25UZVh0IE1rSVYgMjAyMS4xMi4xMCAxMTo0MTwveG1wOkNyZWF0b3JUb29s Pjx4bXA6TW9kaWZ5RGF0ZT4yMDIxLTEyLTIwVDA5OjQzOjMzLTA1OjAwPC94bXA6TW9kaWZ5RGF0 ZT48eG1wOk1ldGFkYXRhRGF0ZT4yMDIxLTEyLTIwVDA5OjQzOjMzLTA1OjAwPC94bXA6TWV0YWRh dGFEYXRlPjwvcmRmOkRlc2NyaXB0aW9uPjxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHht bG5zOnBkZj0iaHR0cDovL25zLmFkb2JlLmNvbS9wZGYvMS4zLyI+PHBkZjpLZXl3b3Jkcy8+PHBk ZjpQcm9kdWNlcj5MdWFUZVgtMS4xMzwvcGRmOlByb2R1Y2VyPjxwZGY6VHJhcHBlZD5GYWxzZTwv cGRmOlRyYXBwZWQ+PC9yZGY6RGVzY3JpcHRpb24+PHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9 IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iPjx4bXBNTTpE b2N1bWVudElEPnV1aWQ6N2U4NWI5OTYtNDg1MC04OGIwLThlN2ItNzY2N2E4NjEzYzQzPC94bXBN TTpEb2N1bWVudElEPjx4bXBNTTpJbnN0YW5jZUlEPnV1aWQ6ZmVmYmY0ZmItNDVjMS1iNGU4LTRh ZTYtM2JhOWUyMjQzZTA5PC94bXBNTTpJbnN0YW5jZUlEPjwvcmRmOkRlc2NyaXB0aW9uPjwvcmRm OlJERj48L3g6eG1wbWV0YT48P3hwYWNrZXQgZW5kPSJ3Ij8+CmVuZHN0cmVhbQplbmRvYmoKMTMg MCBvYmoKPDwgL1N1YnR5cGUgL0NJREZvbnRUeXBlMEMgL0ZpbHRlciAvRmxhdGVEZWNvZGUgL0xl bmd0aCAxNzE5ID4+ICAgICAgIApzdHJlYW0KeF51VXtUFNcZn2HZR8piGiabxJnkzmhToygLgfhA TAigIhTWutJG11QFdlhWlh3Y2YUFfPAQWbg8Q/DBGzYsa6RBIk0gikgMTVKJ70his9SjhmBajTnp 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 PM7hHOD8qvVY1gw1UB5t6DrxWrQN2uGVCWmz/4v4CvwOa/Dj5Fcf3L2jfgLsGnwuzFTlWuA0NLIm rQaWcc2y1tRNP65cMKt90G+thXhmJM+SXRphRmZH0mGQYXhoMMpuW7a/ZXi3v68u1hOHTgDoz8ZS kAN1VN+gJlSYhqn4FLBTMBvTXUaFhcloYmTIm5yzQTarZq6xq4+YsXQiMQ0s/tKYHEhcGR0Yjcwc g0E27IIr0T4QBzPvXrfOwtxoHtiVxDdxZgbej80Aq2aykzZyFQ+byUeAZXyHMWlndfm3buLp5f1b t3CR+1Hp+uNm7ab57vHbxGLddhh79Pd6J2DOdg0WYXYYBuBq7B2WPLs9ywxdjg+9AWxXATEJqk2r MZZu4rP4KDZs2OD2+e+JRWXvT+CD38EGW7qOYuZyQpUTZCXn4Wvcz4zfgOTHehXnjPc/bbloK928 RFbMJ0hJBdlnJc3GIeiHwWRiHJLJcfYH/CGOAfPgs0aXzVQY233ac9xRffKoisIUPty/Nf2Mds8c zmuVKg7B9QUjaU3sstZ5gk7uqQy3G7iSpd3598ZSqexYmuOWSpbSudRYOpVKpzMpbg9wpn8ANf21 +wplbmRzdHJlYW0KZW5kb2JqCjE5IDAgb2JqCjw8IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlIC9MZW5n dGggMzkyID4+ICAgICAgICAKc3RyZWFtCnhejVLBauMwEL3rK2YPgfTgWok3tIRgaO0WTJsmNKa0 vTnSOBXEkpHlQ/5+R0rcQCndCgyamTdv5j159Ge9iW6k2WKUXHJ4xs70VmCULauWjUa5EX2D2j0h SpRDtZvD2hqxQQfjrMgLrdwFgQst9r3EAfU96BZ3Sp8hfg6MS3yNVm/le/kQPVZO6aWRaPWych/R M+76fWUj7ieUyu1x/js8ECn8TAqB9AVtp4yew+SSc06JOy0z03jZHYtP+iAeFNdKS3uyCbZeDZtM QSrhTlHIiYb8882bQ+ewKXRt2GIBMclRnbOHoOGCxStLSpXewfjnVQm66dt2j34t4CxNQWJNE8i/ p6pBiL2HhaSqcof/mHluLQ8tAm1PVJPj+oKs79pKoK30DtmCLOEpLO7ppAy1/FLnx65tfYQTYLgm Q0V8VJZ4plcT4uE84SlFs2lGUX6dzPIs+XvM5OfMLMza1qHXT/V2fmoVvbUkNHgeHPAClMbPZ2lN 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 b25UZVh0LlN1cHBvcnQgKGNvbnRleHRnYXJkZW4ubmV0KSAvQ29uVGVYdC5UaW1lICgyMDIxLTEy LTIwIDA5OjQzKSAvQ29uVGVYdC5VcmwgKHd3dy5wcmFnbWEtYWRlLmNvbSkgL0NvblRlWHQuVmVy c2lvbiAoMjAyMS4xMi4xMCAxMTo0MSkgL0NyZWF0aW9uRGF0ZSAoRDoyMDIxMTIyMDA5NDMzMy0w NScwMCcpIC9DcmVhdG9yIDxmZWZmMDA0YzAwNzUwMDYxMDA1NDAwNjUwMDU4MDAyMDAwMzEwMDJl MDAzMTAwMzMwMDIwMDAzNzAwMzQwMDMyMDAzMDAwMjAwMDJiMDAyMDAwNDMwMDZmMDA2ZTAwNTQw MDY1MDA1ODAwNzQwMDIwMDA0ZDAwNmIwMDQ5MDA1NjAwMjAwMDMyMDAzMDAwMzIwMDMxMDAyZTAw MzEwMDMyMDAyZTAwMzEwMDMwMDAyMDAwMzEwMDMxMDAzYTAwMzQwMDMxPiAvSUQgKHRlc3QgfCAy MDIxLTEyLTIwVDA5OjQzOjMzLTA1OjAwKSAvTW9kRGF0ZSAoRDoyMDIxMTIyMDA5NDMzMy0wNScw MCcpIC9Qcm9kdWNlciAoTHVhVGVYLTEuMTMpIC9UZVguU3VwcG9ydCAodHVnLm9yZykgL1RpdGxl IDxmZWZmMDA3NDAwNjUwMDczMDA3ND4gL1RyYXBwZWQgL0ZhbHNlIC9QVEVYLkZ1bGxCYW5uZXIg KFRoaXMgaXMgTHVhVGVYLCBWZXJzaW9uIDEuMTMuMCAoVGVYIExpdmUgMjAyMSkpID4+CmVuZG9i ago5IDAgb2JqCjw8IC9UeXBlIC9PYmpTdG0gL04gMjAgL0ZpcnN0IDE0MyAvRmlsdGVyIC9GbGF0 ZURlY29kZSAvTGVuZ3RoIDg5NyA+PiAgICAgICAgCnN0cmVhbQp4XrWWXU8iMRSG7/0V59KNgWk7 34kxQZTFLKABdHWNF5Xp4iQwQ2aGRP79vu2gIohDXLwA2nJ6PtqnbyuIESce4MNJeDZxQbYfkk9u 4BB3yReCuEch84j7FDo+ocE9QQITbeYdCEx1Qo+0nes45MLODUngN2Q2fMIyxK9PgsO5Q8LGmM1I OD6jAAYeIxvBfeYeHB+TNVzMFFlXcozvZpoUKilyspFnn6y+ytN5NlI5kjYDXRXF8jR9pnv04dMO 6z4Trg4q6h5zApse4CZLZ5tGK1bIFmbDLJ7uYHYlM+SE1HUGJycm6RYSJdNwUKJJrWVjLcqWwKKV LY6VLaehxCwdDVSB1K2rsxbCq+cCacDjPbkcw06AajCCRF86L0N+sPJ/IFY6nLENa47dW/fAsXFv IR5Wll7XcqbyURbPijQra+vJKbbjtt1v9FpHnW4/ncqEi1pfjecTqW0mcpyjcmN8Wi5izQETNRFo UELAxMEAVrmRj/Tyma7VlLO2isdPBXnYKkuH1X+aWdZFISfxqJGMJwqLZg0KNb2hkOs8yjkOuDER W/FEgd2SkuWWlByZjbEG88fCdPUgXJ0nozSKkzFiRIgXF4tam6xTmavSfnuhZYaRRExY5igTh0RH 1fyk10kMxwonojKT5sWZ9rBMaJfQa/uCw2SY+q2PrmnB5WCRY5Uukr+poRH7E+dFtqDDRpQ+qh9k XWaRynTlhy+VY3Awn80maqpXnmk0DYIeDgW+A1b3UBy3haOLZbZbx14y28PPA+3GzeXd8M/w11FH FnHSxfpkSVcWTxX0cOYAH0gMI4cBcdtF640f093Kj5n2MUDcBWjbCHp3qP+HoKqSNzmCoG5yFH6Z o6oE1mkqdUnTtNSq/dIUelqCXC+sa6nlDGd1pWvjhrjHXeMbvdsNqp+d8167/91QQdJeRekzqFDP NqjE3mSpquQPoPpAnHCQq2RymzhVJbAGFfR/CRUum2+QKC4Co1EONxq1Gzd3vdvzxs13c7N6mX3C Dbjfis3etKiq4k1s8Dzb0CLxdS2qSmAdm1ctwktx79i8f2PmpF+Zc/0gIetXHOkbvaTWvMTejJsS r5EULwb9Ms2Xrz+rI/VVqhJcol1VyAhGELcyaW3YkY9qkpu7uDefaufMdAaQFf2iKe9bHaq017cj Wde56qUJGjcqy+M0IYtDGJHOP7YOWsEKZW5kc3RyZWFtCmVuZG9iagozMyAwIG9iago8PCAvVHlw ZSAvWFJlZiAvSW5kZXggWyAwIDM0IF0gL1NpemUgMzQgL1cgWyAxIDIgMSBdIC9Sb290IDMxIDAg UiAvSW5mbyAzMiAwIFIgL0lEIFsgPERBQkFDQjlFRjBFMjUxRUIxNjcwNUIzRjJCMUE4MEVGPiA8 REFCQUNCOUVGMEUyNTFFQjE2NzA1QjNGMkIxQTgwRUY+IF0gL0ZpbHRlciAvRmxhdGVEZWNvZGUg L0xlbmd0aCAxMTAgPj4gICAgICAgIApzdHJlYW0KeF4dzL8OQ3AcBPA79adU0TLYxCAGTRqJwSwx W3gBr+HN+lxi1fsZPrl875IvgNOCTwGRQZlIKHex5c1uAePdbJbcmA9gsZrbEVc8lhNYbabzJZAH 6xlsCtM9JZKYnwP8Xr9ekrL9gf2IP2gfCqQKZW5kc3RyZWFtCmVuZG9iagpzdGFydHhyZWYKMTQ0 MDUKJSVFT0YK --Apple-Mail=_24F42C41-1825-4224-A4AD-E8391E9F6E74 Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset=utf-8

newcircleA = :=3D 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 =C2=AB & =C2=BB operator = :
newcircleA :=3D 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 :

% = =E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2= =80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80= =94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94
<= div>\startMPpage
path circleA , circleB ;
pair = P[];
defaultscale :=3D 0.4 ;

circleA :=3D fullcircle scaled 1in randomized 3 = ;
circleB :=3D fullcircle scaled 1in randomized 3 = shifted(0.3in,0.3in) ;

draw circleA = withcolor blue ;
draw circleB withcolor red ;

P[1] :=3D circleA intersectionpoint circleB = ;
dotlabel.lft("$P_1$",P[1]) = ;
dotlabel.rt("$\blue\tfx P_0^A$",point 0 of circleA) = ;
P[2] :=3D 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 :=3D (circleA cutbefore = P1 cutafter P2 ) & (P2 -- P1) & cycle  ;
% = previous line gives an error :
% "! Paths don't touch; `&' = will be changed to `..'."
newcircleA :=3D circleA cutbefore P1 = cutafter P2 -- (P2 -- P1) -- cycle  ;
newcircleA :=3D = newcircleA xshifted 2in ;
draw newcircleA  withcolor = darkgreen ;

newcircleB :=3D (circleB = cutafter P1)  -- (P1 -- P2) -- (circleB cutbefore P2 ) & cycle = ; 
newcircleB :=3D newcircleB xshifted 2in = ;
draw newcircleB withcolor black ;
drawpoints = newcircleA ; drawpointlabels newcircleA ;

% Mikael solution 
newcircleA :=3D = circleA cutbefore P1 cutafter P2 -- cycle ;
newcircleA :=3D = newcircleA yshifted -1.5in ;
draw newcircleA  withcolor = darkgreen ;
drawpoints newcircleA ; drawpointlabels newcircleA = ;

% partial = moon 
newcircleA :=3D circleA cutbefore P1 cutafter = P2 
.. reverse(circleB cutbefore P1 = cutafter P2) .. cycle; 
% & (reverse(circleB) cutbefore = P2 cutafter P1) & cycle; 
newcircleA :=3D newcircleA = shifted(2in,-1.5in) ;
draw newcircleA  withcolor magenta = ;
drawpoints newcircleA ; drawpointlabels newcircleA = ;

\stopMPpage
% = =E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2= =80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80= =94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94

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 =C2=AB = & =C2=BB (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 =C2=AB fit together =C2=BB (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 =C2=AB circleA =C2=BB, 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 :=3D = circleA cutbefore P1 cutafter P2 & (P2 -- P1) & cycle  ;

The =C2=AB & =C2=BB 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 `..=E2=80=99."

Which I = do not understand since the paths =C2=AB touch =C2=BB. There was a = similar question last year, without a clear answer (=C2=AB
METAPOST subpath rounding issue =C2=BBhttps://www.mail-archive.com/ntg-context@ntg.nl/msg94294.html).

A solution is to ignore the repeating = points :
newcircleA :=3D 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 :=3D = fullcircle scaled 1in randomized 3 ;
circleB :=3D = fullcircle scaled 1in randomized 3 shifted(0.3in,0.3in) ;

draw circleA withcolor blue ;
draw= circleB withcolor red ;

P[1] :=3D circleA = intersectionpoint circleB ;
dotlabel.lft("$P_1$",P[1]) = ;
dotlabel.rt("$\blue\tfx P_0^A$",point 0 of circleA) ;
P[2] :=3D 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 :=3D circleA cutbefore P1 cutafter P2 & (P2 -- P1) & = cycle  ;
% previous line gives an error :
% "! Paths don't touch; `&' will be changed to `..'."
newcircleA :=3D circleA cutbefore P1 cutafter P2 -- (P2 -- = P1) -- cycle  ;
newcircleA :=3D newcircleA xshifted = 2in ;
draw newcircleA  withcolor darkgreen ;

newcircleB :=3D (circleB cutafter P1)  -- = (P1 -- P2) -- (circleB cutbefore P2 ) & cycle ;
newcircleB :=3D 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
_______________________________________________________________= ____________________

= --Apple-Mail=_24F42C41-1825-4224-A4AD-E8391E9F6E74-- --Apple-Mail=_831C311D-634E-4893-98EB-B5D024273ED5-- --===============2940633188104453712== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Disposition: inline X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX18KSWYgeW91ciBxdWVzdGlvbiBpcyBvZiBpbnRlcmVz dCB0byBvdGhlcnMgYXMgd2VsbCwgcGxlYXNlIGFkZCBhbiBlbnRyeSB0byB0aGUgV2lraSEKCm1h aWxsaXN0IDogbnRnLWNvbnRleHRAbnRnLm5sIC8gaHR0cDovL3d3dy5udGcubmwvbWFpbG1hbi9s aXN0aW5mby9udGctY29udGV4dAp3ZWJwYWdlICA6IGh0dHA6Ly93d3cucHJhZ21hLWFkZS5ubCAv IGh0dHA6Ly9jb250ZXh0LmFhbmhldC5uZXQKYXJjaGl2ZSAgOiBodHRwczovL2JpdGJ1Y2tldC5v cmcvcGhnL2NvbnRleHQtbWlycm9yL2NvbW1pdHMvCndpa2kgICAgIDogaHR0cDovL2NvbnRleHRn YXJkZW4ubmV0Cl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCg== --===============2940633188104453712==--