1
2
3
4
5
6
7
8
9
10
11
12
13
14if known metafun_loaded_shap : endinput ; fi ;
15
16newinternal boolean metafun_loaded_shap ; metafun_loaded_shap := true ; immutable metafun_loaded_shap ;
17
18path predefined_shapes[] ;
19
20def start_predefined_shape_definition =
21
22 begingroup ;
23
24 save xradius, yradius, xxradius, yyradius ;
25 save ll, lr, ur, ul, llx, lly, lrx, lry, urx, ury, ulx, uly, llxx, llyy, lrxx, lryy, urxx, uryy, ulxx, ulyy, lc, rc, tc, bc ;
26
27 numeric xradius, yradius, xxradius, yyradius ;
28 pair ll, lr, ur, ul, llx, lly, lrx, lry, urx, ury, ulx, uly, llxx, llyy, lrxx, lryy, urxx, uryy, ulxx, ulyy, lc, rc, tc, bc ;
29
30 xradius := .15 ;
31 yradius := .15 ;
32 xxradius := .10 ;
33 yyradius := .10 ;
34
35 ll := llcorner (unitsquare shifted (-.5,-.5)) ;
36 lr := lrcorner (unitsquare shifted (-.5,-.5)) ;
37 ur := urcorner (unitsquare shifted (-.5,-.5)) ;
38 ul := ulcorner (unitsquare shifted (-.5,-.5)) ;
39
40 llx := ll shifted (xradius,0) ;
41 lly := ll shifted (0,yradius) ;
42
43 lrx := lr shifted (xradius,0) ;
44 lry := lr shifted (0,yradius) ;
45
46 urx := ur shifted (xradius,0) ;
47 ury := ur shifted (0,yradius) ;
48
49 ulx := ul shifted (xradius,0) ;
50 uly := ul shifted (0,yradius) ;
51
52 llxx := ll shifted (xxradius,0) ;
53 llyy := ll shifted (0,yyradius) ;
54
55 lrxx := lr shifted (xxradius,0) ;
56 lryy := lr shifted (0,yyradius) ;
57
58 urxx := ur shifted (xxradius,0) ;
59 uryy := ur shifted (0,yyradius) ;
60
61 ulxx := ul shifted (xxradius,0) ;
62 ulyy := ul shifted (0,yyradius) ;
63
64 lc := ll shifted (0,.5) ;
65 rc := lr shifted (0,.5) ;
66 tc := ul shifted (.5,0) ;
67 bc := ll shifted (.5,0) ;
68
69enddef ;
70
71def stop_predefined_shape_definition =
72
73 endgroup ;
74
75enddef ;
76
77
78
79start_predefined_shape_definition ;
80
81 predefined_shapes[ 0] := (origincycle) ;
82 predefined_shapes[ 5] := (llxlrx{right}...rc...{left}urxulx{left}...lc...{right}cycle) ;
83 predefined_shapes[ 6] := (lllrx{right}...rc...{left}urxulcycle) ;
84 predefined_shapes[ 7] := (lllrx{right}...rc...{left}urxulcycle) rotatedaround(origin,180) ;
85 predefined_shapes[ 8] := (lrury{up}...tc...{down}ulyllcycle) ;
86 predefined_shapes[ 9] := (lrury{up}...tc...{down}ulyllcycle) rotatedaround(origin,180) ;
87 predefined_shapes[10] := (lllrurulllurulllcycle) ;
88 predefined_shapes[11] := (lllrurullllrulllcycle) ;
89 predefined_shapes[12] := (lllrxurulxcycle) ;
90 predefined_shapes[13] := (llxlrurxulcycle) ;
91 predefined_shapes[14] := (llybclryurytculycycle) ;
92 predefined_shapes[15] := (llxlrxrcurxulxlccycle) ;
93 predefined_shapes[16] := (lllrxrcurxulcycle) ;
94 predefined_shapes[17] := (lllrxrcurxulcycle) rotatedaround(origin,180) ;
95 predefined_shapes[18] := (lrurytculyllcycle) ;
96 predefined_shapes[19] := (lrurytculyllcycle) rotatedaround(origin,180) ;
97 predefined_shapes[20] := (lllrurulllllxxulxxullllrururxxlrxxcycle) ;
98 predefined_shapes[21] := (ullllrurululyyuryyurullllrlryyllyycycle) ;
99 predefined_shapes[22] := (lllrxlryurulxulycycle) ;
100 predefined_shapes[23] := (llxlruryurxulllycycle) ;
101 predefined_shapes[24] := (lllrurulcycle) ;
102 predefined_shapes[25] := (llxlrxlryuryurxulxulyllycycle) ;
103 predefined_shapes[26] := (lllrxlryurulcycle) ;
104 predefined_shapes[27] := (lllruryurxulcycle) rotatedaround(origin,180) ;
105 predefined_shapes[28] := (lllruryurxulcycle) ;
106 predefined_shapes[29] := (lllrxlryurulcycle) rotatedaround(origin,180) ;
107 predefined_shapes[30] := (bc{right}...{up}rc...tc{left}...{down}lc...{right}bc & bctc & tc{left}..{down}lc & lcrc & rc{up}..tc{left}...{down}lc...{right}bc & cycle) rotated 45;
108 predefined_shapes[31] := (bc{right}...{up}rc...tc{left}...{down}lc...{right}bc & bctc & tc{left}..{down}lc & lcrc & rc{up}..tc{left}...{down}lc...{right}bc & cycle) ;
109 predefined_shapes[32] := (ll{right}...{right}lryurulllcycle) ;
110 predefined_shapes[33] := (ll{right}...{right}lryurulllcycleululxulx shifted(0,yyradius)ur shifted(yyradius,yyradius)lry shifted(yyradius,yyradius)lry shifted(0,yyradius)urulcycle ) ;
111 predefined_shapes[34] := (uly..tc..ury & ury..tc shifted (0,-2yradius)..uly & ulylly & lly..bc..lry & lryury & ury..tc shifted (0,-2yradius)..uly & cycle ) ;
112 predefined_shapes[35] := (bc{right}...rc{up}...tc{left}...lc{down}...cycle) ;
113 predefined_shapes[36] := (ultc{right}..rc{down}..{left}bcll & ll..(xpart llx, ypart lc)..ul & cycle) ;
114 predefined_shapes[37] := (ultc{right}..rc{down}..{left}bcll & ll..(xpart llx, ypart lc)..ul & cycle) rotatedaround(origin,180) ;
115 predefined_shapes[38] := (lllc{up}..tc{right}..{down}rclr & lr..(xpart bc, ypart lly)..ll & cycle) ;
116 predefined_shapes[39] := (lllc{up}..tc{right}..{down}rclr & lr..(xpart bc, ypart lly)..ll & cycle) rotatedaround(origin,180) ;
117 predefined_shapes[40] := (lllrurulllurullllrulllcycle) ;
118 predefined_shapes[41] := (lllrurullllrrclcllbctculll & cycle) ;
119 predefined_shapes[42] := (lllrorigin shifted (epsilon,0)urulorigin shifted (epsilon,0)cycle) ;
120 predefined_shapes[43] := (llulorigin shifted (0,epsilon)urlrorigin shifted (0,epsilon)cycle) ;
121 predefined_shapes[45] := (bcrctclccycle) ;
122 predefined_shapes[46] := (llulrccycle) ;
123 predefined_shapes[47] := (llulrccycle) rotatedaround(origin,180) ;
124 predefined_shapes[48] := (ulurbccycle) rotatedaround(origin,180) ;
125 predefined_shapes[49] := (ulurbccycle) ;
126 predefined_shapes[56] := (lllryuryulcycle) ;
127 predefined_shapes[57] := (lllryuryulcycle) rotatedaround(origin,180) ;
128 predefined_shapes[58] := (llulxurxlrcycle) ;
129 predefined_shapes[59] := (llulxurxlrcycle) rotatedaround(origin,180);
130 predefined_shapes[66] := (rcorigin shifted ( epsilon,0) cycle & rcorigincycle ) ;
131 predefined_shapes[67] := (lcorigin shifted (epsilon,0) cycle & lcorigincycle ) ;
132 predefined_shapes[68] := (tcorigin shifted (0, epsilon) cycle & tcorigincycle ) ;
133 predefined_shapes[69] := (bcorigin shifted (0,epsilon) cycle & bcorigincycle ) ;
134 predefined_shapes[75] := (llylryuryulycycle) rotatedaround(origin,180) ;
135 predefined_shapes[76] := (lllrurulycycle) rotatedaround(origin,180) ;
136 predefined_shapes[77] := (lllruryulcycle) rotatedaround(origin,180) ;
137 predefined_shapes[78] := (llylrurulcycle) rotatedaround(origin,180) ;
138 predefined_shapes[79] := (lllryurulcycle) rotatedaround(origin,180) ;
139
140 numeric predefined_shapes_xradius ; predefined_shapes_xradius := xradius ;
141 numeric predefined_shapes_yradius ; predefined_shapes_yradius := yradius ;
142 numeric predefined_shapes_xxradius ; predefined_shapes_xxradius := xxradius ;
143 numeric predefined_shapes_yyradius ; predefined_shapes_yyradius := yyradius ;
144
145stop_predefined_shape_definition ;
146
147vardef some_shape_path (expr type) =
148 if known predefined_shapes[type] : predefined_shapes[type] else : predefined_shapes[24] fi
149enddef ;
150
151def some_shape (expr shape_type, shape_width, shape_height, shape_linewidth, shape_linecolor, shape_fillcolor) =
152 begingroup ;
153 save p ; path p ;
154 p := some_shape_path (shape_type) xscaled shape_width yscaled shape_height ;
155 pickup pencircle scaled shape_linewidth ;
156 fill p withcolor shape_fillcolor ;
157 draw p withcolor shape_linecolor ;
158 endgroup ;
159enddef ;
160
161
162
163
164
165
166
167
168
169vardef drawpredefinedshape (expr t, p, lw, lc, fc) =
170 save pp ;
171 if t > 1 :
172 path pp ;
173 pp := some_shape_path(t) xyscaled(bbwidth(p), bbheight(p)) shifted center p ;
174 fill pp withcolor fc ;
175 draw pp withpen pencircle scaled lw withcolor lc ;
176 elseif t = 1 :
177 path pp ;
178 pp := fullsquare xyscaled(bbwidth(p), bbheight(p)) shifted center p ;
179 fill pp withcolor fc ;
180 else :
181 picture pp ; pp := nullpicture ;
182 setbounds pp to fullsquare xyscaled(bbwidth(p), bbheight(p)) shifted center p ;
183 draw pp ;
184 fi ;
185enddef ;
186
187vardef drawpredefinedline (expr t, p, lw, lc) =
188 if (t>0) and (length(p)>1) :
189 saveoptions ;
190 drawoptions(withpen pencircle scaled lw withcolor lc) ;
191 draw p ;
192 if t = 1 :
193 draw arrowheadonpath(p,1) ;
194 elseif t = 2 :
195 draw arrowheadonpath(reverse p,1) ;
196 elseif t = 3 :
197 for $ = p,reverse p :
198 draw arrowheadonpath($,1) ;
199 endfor ;
200 elseif t = 11 :
201 draw arrowheadonpath(p,12) ;
202 elseif t = 12 :
203 draw arrowheadonpath(reverse p,12) ;
204 elseif t = 13 :
205 for $=p,reverse p :
206 draw arrowheadonpath($,1) ;
207 endfor ;
208 for $=p,reverse p :
209 draw arrowheadonpath($,34) ;
210 endfor ;
211 elseif t = 21 :
212 for $=15,12,45 :
213 draw arrowheadonpath(p,$) ;
214 endfor ;
215 elseif t = 22 :
216 for $=15,12,45 :
217 draw arrowheadonpath(reverse p,$) ;
218 endfor ;
219 elseif t = 23 :
220 for $=p,reverse p :
221 draw arrowheadonpath($,14) ;
222 endfor ;
223 fi ;
224 fi ;
225enddef ;
226
227let drawshape = drawpredefinedshape ;
228let drawline = drawpredefinedline ;
229 |