On 8/1/2016 8:03 AM, Mikael P. Sundqvist wrote:
Hi!
I look for a way to randomize control points of a path, leaving the
coordinates themselves untouched.
The reason is the following: I want to draw (for example) a circle
with a triangle inside, and I want them to look slightly randomized.
If I do (see attached pdf for a typical result of this)
\startMPpage
draw fullcircle scaled 2cm randomized 0.1cm;
draw ((1cm,0)--(0,1cm)--(-1cm,0)--cycle) randomized 0.1cm;
\stopMPpage
then the corners of the triangle does not stay on the circle (and I
want them to). [I dont want the triangle to consist of perfectly
straight lines, so I cannot (directly) draw the triangle using
different points along the randomized circle] I imagine that one could
achieve what I want if one could randomize the control points only.
i'll add
primarydef p randomizedcontrols s = (
if path p :
for i=0 upto length(p)-1 :
(point i of p) .. controls
((postcontrol i of p) randomshifted s) and
((precontrol (i+1) of p) randomshifted s) ..
endfor
if cycle p :
cycle
else :
(point length(p) of p)
fi
else :
p randomized s
fi
) enddef ;
Also, is it possible to randomize a picture (consisting of several
paths/points) somehow, without randomizing each part of it manually?
so:
vardef mfun_randomized_path(expr p,s) =
for i=0 upto length(p)-1 :
(point i of p) .. controls
((postcontrol i of p) randomshifted s) and
((precontrol (i+1) of p) randomshifted s) ..
endfor
if cycle p :
cycle
else :
(point length(p) of p)
fi
enddef;
vardef mfun_randomized_picture(expr p,s) =
save currentpicture ;
picture currentpicture ;
currentpicture := nullpicture ;
for i within p :
addto currentpicture
if stroked i :
doublepath pathpart i randomizedcontrols s
dashed dashpart i
withpen penpart i
withcolor colorpart i
withprescript prescriptpart i
withpostscript postscriptpart i
elseif filled i :
contour pathpart i randomizedcontrols s
withpen penpart i
withcolor colorpart i
withprescript prescriptpart i
withpostscript postscriptpart i
else :
also i
fi
;
endfor ;
currentpicture
enddef ;
primarydef p randomizedcontrols s = (
if path p :
mfun_randomized_path(p,s)
elseif picture p :
mfun_randomized_picture(p,s)
else :
p randomized s
fi
) enddef ;
with
draw fullcircle scaled 2cm randomizedcontrols 0.1cm;
draw ((1cm,0)--(0,1cm)--(-1cm,0)--cycle) randomizedcontrols 0.1cm;
draw image (
draw fullcircle scaled 2cm ;
draw ((1cm,0)--(0,1cm)--(-1cm,0)--cycle);
) randomizedcontrols 0.1cm ;
-----------------------------------------------------------------
Hans Hagen | PRAGMA ADE
Ridderstraat 27 | 8061 GH Hasselt | The Netherlands
tel: 038 477 53 69 | www.pragma-ade.nl | www.pragma-pod.nl
-----------------------------------------------------------------
___________________________________________________________________________________
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://tex.aanhet.net
archive : http://foundry.supelec.fr/projects/contextrev/
wiki : http://contextgarden.net
___________________________________________________________________________________