Randomize control points in metapost/metafun?
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. Also, is it possible to randomize a picture (consisting of several paths/points) somehow, without randomizing each part of it manually? /Mikael
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 -----------------------------------------------------------------
On Mon, Aug 1, 2016 at 10:12 AM, Hans Hagen
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 ___________________________________________________________________________________
Wow! That was fast! I just updated and it indeed works as expected. I hate to ask another thing when I just got this fast and nice help, but is there also a way to change the control points in such a way that no _new_ sharp corners occur? /Mikael
On 8/1/2016 12:47 PM, Mikael P. Sundqvist wrote:
Wow! That was fast! I just updated and it indeed works as expected.
I hate to ask another thing when I just got this fast and nice help, but is there also a way to change the control points in such a way that no _new_ sharp corners occur?
that's a challenge for alan (who likes mp challenges) as it involves math Hans ----------------------------------------------------------------- Hans Hagen | PRAGMA ADE Ridderstraat 27 | 8061 GH Hasselt | The Netherlands tel: 038 477 53 69 | www.pragma-ade.nl | www.pragma-pod.nl -----------------------------------------------------------------
participants (2)
-
Hans Hagen
-
Mikael P. Sundqvist