-
Notifications
You must be signed in to change notification settings - Fork 1
/
mp-sketch.mp
93 lines (77 loc) · 2.26 KB
/
mp-sketch.mp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
%D \module
%D [ file=mp-sketch.mp
%D version=2013.02.03
%D title=\CONTEXT\ \METAPOST\ graphics,
%D subtitle=Sketch drawing,
%D author=Aditya Mahajan,
%D date=\currentdate,
%D copyright={Aditya Mahajan}]
%D This metapost module is inspired by a TeX.SE question:
%D http://tex.stackexchange.com/q/39296/323
%D
%D I thought that it would be fun to implement a similar feature in MetaPost.
%D
%D To use this package in MetaPost:
%D
%D \starttyping
%D input mp-sketch;
%D
%D beginfig(1)
%D sketchypaths; % Make draw and fill sketchy
%D ...
%D naturalizepaths; % Restore the value of draw and fill
%D ...
%D endfig
%D \stoptyping
%D
%D The code is heavily inspired by Hans Hagen's Metafun macros.
%D
%D The macro \type{sketchypaths} is modeled after \type{visualizepaths} from
%D \filename{mp-tool}.
def sketchypaths =
let draw = sketchdraw ;
let fill = sketchfill ;
enddef ;
%D Check if \filename{mp-tool} is loaded
if not known context_tool :
let normaldraw = draw;
let normalfill = fill;
def naturalizepaths =
let fill = normalfill ;
let draw = normaldraw ;
enddef ;
fi
%D The variable \type{sketch_amount} determines the amount of randomness in the
%D drawing
numeric sketch_amount; sketch_amount := 3bp;
%D The macro \type{sketchdraw} randomized the path before drawing it. The
%D \type{expr} ... \type{text} trick is copied from the definition of
%D \type{drawarrow}
def sketchdraw expr p =
do_sketchdraw(p if (path p): randomized sketch_amount fi)
enddef;
def do_sketchdraw(expr p) text t =
normaldraw p t ;
enddef;
%D The macro \type{sketchfill} randomizes the path before filling it.
def sketchfill expr p =
do_sketchfill(p if (path p): randomized sketch_amount fi)
enddef ;
def do_sketchfill(expr p) text t =
normalfill p t ;
enddef ;
endinput;
% Modified example from
% http://tex.loria.fr/prod-graph/zoonekynd/metapost/metapost.html
beginfig(1)
pair A,B,C,O;
A=(0,0); B=(3cm,0); C=(1cm,2cm);
O - 1/2[B,C] = whatever * (B-C) rotated 90;
O - 1/2[A,B] = whatever * (A-B) rotated 90;
sketchypaths;
sketch_amount := 5bp;
draw A--B--C--cycle;
draw O withpen pencircle scaled 4bp;
sketch_amount := 2bp;
draw fullcircle scaled 2abs(O-A) shifted O;
endfig