# [metapost] Redefine ..

Laurent Méhats laurent.mehats at gmail.com
Wed Jun 6 18:11:04 CEST 2012

```Le 04/06/2012 18:00, Troy Henderson a écrit :
> I am drawing 3D graphics, and many of my "points" are colors instead of
> pairs.  Of course, the colors are projected to pairs eventually, but I
> would like to define paths of colors directly with .. by doing something like
>
> path p;
> p:=(1,2,3)..(4,5,6)..(7,8,9);
>
> I have a vardef P that transforms colors into pairs, and thus I can always
> just do
>
> p:=P(1,2,3)..P(4,5,6)..P(7,8,9);
>
> but I would like to be able to omit this P usage.  My attempt thusfar is
>
> ---
> def pathnode primary a =
>     if color a:
>        P(a)
>     else:
>        a
>     fi;
> enddef;
>
> primarydef a .. b =
>     pathnode(a) .. pathnode(b)
> enddef;
> ---
>
> but this is not working.  I would appreciate any insight into how I might
> fix this so that I can use .. between pairs.
>
>
> Troy Henderson
>
>
> --
> http://tug.org/metapost/

A dirty workaround could be to scan color-path expressions looking for
colors, then prefixing them with P (thus turning
"(1,2,3)..(4,5,6)..(7,8,9)" into "P(1,2,3)..P(4,5,6)..P(7,8,9)"). Here is
a naive attempt.

vardef P expr clr=
(redpart clr, greenpart clr)
enddef;

vardef map @# expr pth=
string fun, aux, res, chr, acc;
numeric len;
fun:=str @#;
aux:=pth;
len:=length aux;
res:="";
forever:
exitif len=0;
chr:=substring(0, 1) of aux;
aux:=substring(1, len) of aux;
len:=len-1;
if chr<>"(":
res:=res&chr;
else: % we look for the next ")" occurrence
acc:=chr;
forever:
exitif len=0;
chr:=substring(0, 1) of aux;
aux:=substring(1, len) of aux;
len:=len-1;
acc:=acc&chr;
exitif chr=")";
endfor
if color scantokens acc:
res:=res&fun&acc;
else:
res:=res&acc;
fi
fi
endfor
show res;
scantokens res
enddef;

draw map P "(0, 1, 2) .. controls (3, 4, 5) .. {(6, 7, 8)} (9, 0) .. cycle";

>> "P(0, 1, 2) .. controls P(3, 4, 5) .. {P(6, 7, 8)} (9, 0) .. cycle"

Regards,
Laurent Méhats

```