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
___________________________________________________________________________________

Reply via email to