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 -----------------------------------------------------------------