initial setup of thesis repository
[cluster_expansion_thesis.git] / little_helpers / tikz / sketch-0.2.161 / Data / hand.sk
blob6fed0fa9ccb469fe65a0dc69eadd6d0320c6d316
1 %\r
2 % Very simple model of my hand\r
3 %\r
4 % Gene Ressler\r
5 %\r
6 % In particular, this completely ignores the carpal joints.\r
7 %\r
8 % Try this with various options to sketch.\r
9 %\r
10 % -D fist   \\r
11 % -D ok      > none or one of these\r
12 % -D spread /\r
13 %\r
14 % -D topview   \\r
15 % -D frontview  > none or one of these\r
16 % -D sideview  /\r
17 %\r
18 % -D repeated \r
19 %\r
20 % I am not responsible for modifications to draw\r
21 % obscene gestures.\r
23 % parameterization of model\r
25 % for fingers, 0 is thumb, 1 is index, \r
26 %   2 is middle, 3 is ring, 4 is little\r
28 % lateral angle between fingers\r
29 def spread_rot              \r
30   <fist> 0\r
31   <ok> 5\r
32   <spread>10\r
33   <> 0\r
34 % and between thumb and index finger\r
35 def spread_rot_0 \r
36   <fist> 40\r
37   <ok> 55\r
38   <spread> 55\r
39   <> 25\r
41 % rotations of finger parts\r
42 % distal is the finger tip\r
43 % middle is below that\r
44 % meta is the knuckle\r
45 def distal_0_rot           \r
46   <fist> 60\r
47   <ok> 45\r
48   <> -10\r
49 def middle_0_rot           \r
50   <fist> 50\r
51   <ok> 40\r
52   <spread> 0\r
53   <> 10\r
54 def meta_0_rot \r
55   <fist> 40\r
56   <ok> 35\r
57   <> 0\r
59 def distal_1_rot \r
60   <fist> 90\r
61   <ok> 54\r
62   <> 0\r
63 def meta_1_rot \r
64   <fist> 90\r
65   <ok> 60\r
66   <> 0\r
68 def distal_2_rot\r
69   <fist> 90\r
70   <ok> 30\r
71   <> 0\r
72 def meta_2_rot\r
73   <fist> 90\r
74   <ok> 35\r
75   <> 0\r
77 def distal_3_rot\r
78   <fist> 90\r
79   <ok> 30\r
80   <> 0\r
81 def meta_3_rot\r
82   <fist> 90\r
83   <ok> 30\r
84   <> 0\r
86 def distal_4_rot \r
87   <fist> 90\r
88   <ok> 30\r
89   <> 0\r
90 def meta_4_rot \r
91   <fist> 90\r
92   <ok> 25\r
93   <> 0\r
95 % end parameters\r
97 % useful stuff\r
98 def O (0,0,0)\r
99 def I [1,0,0]\r
100 def J [0,1,0]\r
101 def K [0,0,1]\r
103 % dependent rotations \r
104 % fingers have the last two joints wired together\r
105 def middle_1_rot distal_1_rot\r
106 def middle_2_rot distal_2_rot\r
107 def middle_3_rot distal_3_rot\r
108 def middle_4_rot distal_4_rot\r
110 % proportions \r
111 def proximal_rad           .6\r
112 def distal_rad             .5\r
113 def distal_len            1.8\r
114 def joint_rad              .6\r
115 def joint_gap              .7\r
116 def middle_ratio          1.8\r
117 def proximal_distal_ratio  proximal_rad / distal_rad\r
119 % primitive segment of a finger is a truncated cone\r
120 def segment {\r
121   def n_faces 8\r
122   sweep { n_faces<>, rotate(360 / n_faces, [J]) } \r
123     line(proximal_rad, 0)(distal_rad, distal_len)\r
126 % spheres to connect segments at joints\r
127 def joint_sphere {\r
128   def n_joint_faces 8\r
129   sweep [fillcolor=lightgray] { n_joint_faces, rotate(360 / n_joint_faces, [J]) }\r
130     sweep { n_joint_faces, rotate(180 / n_joint_faces) } \r
131       (0, -joint_rad)\r
134 % following is five separate definitions for five fingers\r
135 % with parameters, this would be much shorter!\r
137 def distal_0 {\r
138   put { translate(joint_gap * joint_rad * [J]) \r
139         then rotate(distal_0_rot, [I]) \r
140         then translate((distal_len + joint_gap * joint_rad) * [J]) }\r
141     {segment}\r
142   put { rotate(distal_0_rot / 2, [I])\r
143         then translate((distal_len + joint_gap * joint_rad) * [J]) } \r
144     {joint_sphere}\r
145   put { scale( [J] + proximal_distal_ratio * ([I]+[K]) ) }\r
146     {segment}\r
147 }  \r
149 def finger_0 {\r
150   put { translate(joint_gap * joint_rad * [J])\r
151         then rotate(middle_0_rot, [I])\r
152         then translate((middle_ratio * distal_len + joint_gap * joint_rad) * [J]) }\r
153     {distal_0}\r
154   put { scale(proximal_distal_ratio)\r
155         then rotate(middle_0_rot / 2, [I])\r
156         then translate((middle_ratio * distal_len + joint_gap * joint_rad) * [J]) } \r
157     {joint_sphere}\r
158   put { scale( middle_ratio * [J] + proximal_distal_ratio^2 * ([I]+[K]) ) }\r
159     {segment}\r
162 def distal_1 {\r
163   put { translate(joint_gap * joint_rad * [J]) \r
164         then rotate(distal_1_rot, [I]) \r
165         then translate((distal_len + joint_gap * joint_rad) * [J]) }\r
166     {segment}\r
167   put { rotate(distal_1_rot / 2, [I])\r
168         then translate((distal_len + joint_gap * joint_rad) * [J]) } \r
169     {joint_sphere}\r
170   put { scale( [J] + proximal_distal_ratio * ([I]+[K]) ) }\r
171     {segment}\r
172 }  \r
174 def finger_1 {\r
175   put { translate(joint_gap * joint_rad * [J])\r
176         then rotate(middle_1_rot, [I])\r
177         then translate((middle_ratio * distal_len + joint_gap * joint_rad) * [J]) }\r
178     {distal_1}\r
179   put { scale(proximal_distal_ratio)\r
180         then rotate(middle_1_rot / 2, [I])\r
181         then translate((middle_ratio * distal_len + joint_gap * joint_rad) * [J]) } \r
182     {joint_sphere}\r
183   put { scale( middle_ratio * [J] + proximal_distal_ratio^2 * ([I]+[K]) ) }\r
184     {segment}\r
187 def distal_2 {\r
188   put { translate(joint_gap * joint_rad * [J]) \r
189         then rotate(distal_2_rot, [I]) \r
190         then translate((distal_len + joint_gap * joint_rad) * [J]) }\r
191     {segment}\r
192   put { rotate(distal_2_rot / 2, [I])\r
193         then translate((distal_len + joint_gap * joint_rad) * [J]) } \r
194     {joint_sphere}\r
195   put { scale( [J] + proximal_distal_ratio * ([I]+[K]) ) }\r
196     {segment}\r
197 }  \r
199 def finger_2 {\r
200   put { translate(joint_gap * joint_rad * [J])\r
201         then rotate(middle_2_rot, [I])\r
202         then translate((middle_ratio * distal_len + joint_gap * joint_rad) * [J]) }\r
203     {distal_2}\r
204   put { scale(proximal_distal_ratio)\r
205         then rotate(middle_2_rot / 2, [I])\r
206         then translate((middle_ratio * distal_len + joint_gap * joint_rad) * [J]) } \r
207     {joint_sphere}\r
208   put { scale( middle_ratio * [J] + proximal_distal_ratio^2 * ([I]+[K]) ) }\r
209     {segment}\r
212 def distal_3 {\r
213   put { translate(joint_gap * joint_rad * [J]) \r
214         then rotate(distal_3_rot, [I]) \r
215         then translate((distal_len + joint_gap * joint_rad) * [J]) }\r
216     {segment}\r
217   put { rotate(distal_3_rot / 2, [I])\r
218         then translate((distal_len + joint_gap * joint_rad) * [J]) } \r
219     {joint_sphere}\r
220   put { scale( [J] + proximal_distal_ratio * ([I]+[K]) ) }\r
221     {segment}\r
222 }  \r
224 def finger_3 {\r
225   put { translate(joint_gap * joint_rad * [J])\r
226         then rotate(middle_3_rot, [I])\r
227         then translate((middle_ratio * distal_len + joint_gap * joint_rad) * [J]) }\r
228     {distal_3}\r
229   put { scale(proximal_distal_ratio)\r
230         then rotate(middle_3_rot / 2, [I])\r
231         then translate((middle_ratio * distal_len + joint_gap * joint_rad) * [J]) } \r
232     {joint_sphere}\r
233   put { scale( middle_ratio * [J] + proximal_distal_ratio^2 * ([I]+[K]) ) }\r
234     {segment}\r
237 def distal_4 {\r
238   put { translate(joint_gap * joint_rad * [J]) \r
239         then rotate(distal_4_rot, [I]) \r
240         then translate((distal_len + joint_gap * joint_rad) * [J]) }\r
241     {segment}\r
242   put { rotate(distal_4_rot / 2, [I])\r
243         then translate((distal_len + joint_gap * joint_rad) * [J]) } \r
244     {joint_sphere}\r
245   put { scale( [J] + proximal_distal_ratio * ([I]+[K]) ) }\r
246     {segment}\r
247 }  \r
249 def finger_4 {\r
250   put { translate(joint_gap * joint_rad * [J])\r
251         then rotate(middle_4_rot, [I])\r
252         then translate((middle_ratio * distal_len + joint_gap * joint_rad) * [J]) }\r
253     {distal_4}\r
254   put { scale(proximal_distal_ratio)\r
255         then rotate(middle_4_rot / 2, [I])\r
256         then translate((middle_ratio * distal_len + joint_gap * joint_rad) * [J]) } \r
257     {joint_sphere}\r
258   put { scale( middle_ratio * [J] + proximal_distal_ratio^2 * ([I]+[K]) ) }\r
259     {segment}\r
262 % points on the palm of the hand\r
263 def proximal_0_loc (1.8,-5.5,0)\r
264 def proximal_1_loc (1.8,.1,0)\r
265 def proximal_2_loc (O)\r
266 def proximal_3_loc (-1.8,-.2,0)\r
267 def proximal_4_loc (-3.6,-.5,0)\r
268 def h5 (proximal_4_loc) + [-.6,-.2]\r
269 def h6 (h5) + [1,-5]\r
270 def h8 (proximal_0_loc) + [.75,-.5]\r
271 def h7 (h8) + [-.6,-.8]\r
272 def h6a (h6) + .6 * ((h7) - (h6))\r
273 def h9 (h8) + [-1.9,1]\r
274 def h10 (proximal_1_loc) + [.85,-.3]\r
276 def hand {\r
278   % thumb has an extra rotation for opposable-ness!\r
279   def opposition_rot rotate(-50, [J])\r
280   def thk_scale_0 1.2\r
281   put { scale([thk_scale_0,.9,thk_scale_0]) % this distorts a little; oh well\r
282         then translate((joint_gap * joint_rad) * [J])\r
283         then [[opposition_rot]]\r
284         then rotate(meta_0_rot, [I])\r
285         then rotate(-spread_rot_0, [K])\r
286         then translate((proximal_0_loc) - (O)) } \r
287     {finger_0}\r
289   put { scale(thk_scale_0 * proximal_distal_ratio^2)\r
290         then [[opposition_rot]]\r
291         then rotate(meta_0_rot / 2, [I])\r
292         then rotate(-spread_rot_0, [K])\r
293         then translate((proximal_0_loc) - (O)) } \r
294     {joint_sphere}\r
296   % index finger\r
297   def scale_1 .85\r
298   put { scale(scale_1) \r
299         then translate((joint_gap * joint_rad) * [J])\r
300         then rotate(meta_1_rot, [I])\r
301         then rotate(-spread_rot, [K])\r
302         then translate((proximal_1_loc) - (O)) } \r
303     {finger_1}\r
305   put { scale(scale_1 * proximal_distal_ratio^2)\r
306         then rotate(meta_1_rot / 2, [I])\r
307         then rotate(-spread_rot, [K])\r
308         then translate((proximal_1_loc) - (O)) } \r
309     {joint_sphere}\r
311   % middle finger\r
312   put { % no scale then\r
313         translate((joint_gap * joint_rad) * [J])\r
314         then rotate(meta_2_rot, [I])\r
315         % no spread rotation\r
316         then translate((proximal_2_loc) - (O)) } \r
317     {finger_2}\r
319   put { scale(proximal_distal_ratio^2)\r
320         then rotate(meta_2_rot / 2, [I])\r
321         then rotate(-spread_rot, [K])\r
322         then translate((proximal_2_loc) - (O)) } \r
323     {joint_sphere}\r
325   % ring finger\r
326   def scale_3 .85\r
327   put { scale(scale_3) \r
328         then translate((joint_gap * joint_rad) * [J])\r
329         then rotate(meta_3_rot, [I])\r
330         then rotate(spread_rot, [K])\r
331         then translate((proximal_3_loc) - (O)) } \r
332     {finger_3}\r
334   put { scale(scale_3 * proximal_distal_ratio^2)\r
335         then rotate(meta_3_rot / 2, [I])\r
336         then rotate(-spread_rot, [K])\r
337         then translate((proximal_3_loc) - (O)) } \r
338     {joint_sphere}\r
340   % little finger\r
341   def scale_4 .7\r
342   put { scale(scale_4) \r
343         then translate((joint_gap * joint_rad) * [J])\r
344         then rotate(meta_4_rot, [I])\r
345         then rotate(2 * spread_rot, [K])\r
346         then translate((proximal_4_loc) - (O)) } \r
347     {finger_4}\r
349   put { scale(scale_4 * proximal_distal_ratio^2)\r
350         then rotate(meta_4_rot / 2, [I])\r
351         then rotate(-spread_rot, [K])\r
352         then translate((proximal_4_loc) - (O)) } \r
353     {joint_sphere}\r
355   % palm is built by sweeping a polygon through a small\r
356   % angle in order to make it thicker at the wrist\r
357   put { translate(joint_gap * joint_rad * -[J]) } % drop polytope to expose knuckles\r
358     sweep { 1, rotate(6, (0,15,0), [I]) }\r
359       put { rotate(-3, (0,15,0), [I]) } {\r
360         % need two polygons for convexity; the desired shape is concave at the thumb\r
361         polygon(proximal_1_loc)(proximal_2_loc)(proximal_3_loc)(proximal_4_loc)\r
362                (h5)(h6)(h6a)(h9)(h10)\r
363         polygon(h6a)(h7)(h8)(h9)\r
364       }\r
367 % a few views\r
368 def viewxf \r
369  <frontview> view((0,0,10))\r
370  <sideview>  view((10,0,0))\r
371  <topview>   view((0,10,0), (O), -[K])\r
372  <>          view((4,3,10))\r
374 % either a single copy or a repeat to show different angles\r
375 def scene \r
376   <repeated>\r
377     put { [[viewxf]] then scale(.25) }  {\r
378       def N 4\r
379       repeat { N, rotate(270/N, [3,2,1]), translate(14*[I]) } {hand}\r
380     }\r
381   <> put { [[viewxf]] then scale(.3) } {hand}\r
383 {scene}\r
385 global {\r
386   set [linewidth=.3pt]\r