From 500caaeda74dd9c660279036293f4b2997cf0b03 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Sat, 9 Sep 2017 09:42:37 +0200 Subject: Add vendor --- vendor/github.com/llgcode/ps/samples/escher.ps | 380 +++++++++++++++++++++++++ 1 file changed, 380 insertions(+) create mode 100644 vendor/github.com/llgcode/ps/samples/escher.ps (limited to 'vendor/github.com/llgcode/ps/samples/escher.ps') diff --git a/vendor/github.com/llgcode/ps/samples/escher.ps b/vendor/github.com/llgcode/ps/samples/escher.ps new file mode 100644 index 0000000..32fbc83 --- /dev/null +++ b/vendor/github.com/llgcode/ps/samples/escher.ps @@ -0,0 +1,380 @@ +%! +% If you're concerned that the cpu in your PostScript printer will atrophy +% from disuse, here is another Escher-like contribution to to keep it busy +% for a while. It uses PostScript color commands, but will still work on +% a monochrome printer (but isn't very pretty in black & white). +% +% The butterflies are arranged in a hexagonal grid (wallpaper group p6), +% and the moveto, lineto, curveto commands used to render the tesselation +% are redefined so as to impose a nonlinear transform that shrinks the +% infinite plane to an ellipse. This is a sleazy way to mimic Escher's +% "circle limit" sorts of things. +% +% The butterfly permimeter was made by imposing all the symmetry constraints +% on a path, and then that path was filled in using Adobe Illustrator +% +% The routines Xform and next_color are easy to change if you want to hack +% with them. The code was written to sacrifice efficiency for readability. +% +% Bob Wallis +% +% UUCP {sun,pyramid,cae780,apple}!weitek!wallis + +%statusdict begin waittimeout 6000 lt % if you have a slow printer, you +% {0 60 6000 setdefaulttimeouts} % might need to uncomment this +%if end + +/nlayers 1 def % 1 takes about 10 minutes on a LW+; 2 takes 4x longer +/warp 1 def % 1 -> ellipsoidal distortion; 0 -> flat Euclidean +/inch {72 mul} def + +/x4 152 def /y4 205.6 def % 6 fold rotation center of bfly +/x12 387.20 def /y12 403.84 def % 3 fold center of bfly + +/dx x4 x12 sub def % [dx,dy] = distance between the +/dy y4 y12 sub def % two fixed points above + +/Dm dx dup mul dy dup mul % magnitude of basis vectors of + add sqrt 3 sqrt mul % parallelogram lattice +def % = |dx,dy| * sqrt(3) + +/Da dy dx atan 30 add def +/D1x Dm Da cos mul def % [D1x, D1y] = basis vector vector #1 +/D1y Dm Da sin mul def % = [Dm,0] exp(j30) + +/Da dy dx atan 30 sub def +/D2x Dm Da cos mul def % [D2x, D2y] = basis vector vector #2 +/D2y Dm Da sin mul def % = [Dm,0] exp(-j30) + +/m { moveto} def +/L {lineto} def +/S {stroke} def +/c {curveto} def +/f {closepath fill} def +/F {closepath fill} def +/g { setgray} def + +/FillStroke { % fill interior & stroke black border + closepath gsave fill grestore 0 setgray stroke +} def + +% +% Description of 1 butterfly +% +/body { + 314.96 280.19 m + 383.4 261.71 445.11 243.23 513.52 224.68 c + 463.68 256.59 490.26 328.83 446.99 360.76 c + 423.71 347.32 397.08 339.7 367.07 337.9 c + 388.93 358.28 414.14 372.84 442.73 381.58 c + 426.68 398.18 394.07 389.7 387.2 403.84 c + 371.52 404.96 362.56 372.48 340.16 366.88 c + 346.88 396.01 346.88 425.12 340.16 454.24 c + 326.72 427.35 320 400.48 320 373.6 c + 270.71 352.1 221.44 411.23 168.88 384.02 c + 189.04 388.03 202.48 380.4 212.57 366.95 c + 216.72 350.85 209.23 341.46 190.1 338.79 c + 177.34 343.57 167.94 354.17 161.9 370.59 c + 176.06 305.52 132.02 274.05 152 205.6 c + 201.29 257.12 250.56 234.72 299.84 279.52 c + 288.64 266.08 284.16 252.64 286.4 239.2 c + 298.27 223.97 310.15 222.18 322.02 233.82 c + 328.62 249.28 328.51 264.74 314.96 280.19 c + FillStroke +} def + +/eyes { + 294.8125 238.3246 m + 296.9115 238.3246 298.6132 242.7964 298.6132 248.3125 c + 298.6132 253.8286 296.9115 258.3004 294.8125 258.3004 c + 292.7135 258.3004 291.0118 253.8286 291.0118 248.3125 c + 291.0118 242.7964 292.7135 238.3246 294.8125 238.3246 c + closepath gsave 1 g fill grestore 0 g S + + 319.5 241.1782 m + 321.7455 241.1782 323.5659 245.4917 323.5659 250.8125 c + 323.5659 256.1333 321.7455 260.4468 319.5 260.4468 c + 317.2545 260.4468 315.4341 256.1333 315.4341 250.8125 c + 315.4341 245.4917 317.2545 241.1782 319.5 241.1782 c + closepath gsave 1 g fill grestore 0 g S + 0 g + 296.875 242.0939 m + 297.4608 242.0939 297.9356 243.479 297.9356 245.1875 c + 297.9356 246.896 297.4608 248.2811 296.875 248.2811 c + 296.2892 248.2811 295.8143 246.896 295.8143 245.1875 c + 295.8143 243.479 296.2892 242.0939 296.875 242.0939 c + f + 0 g + 318.5 243.7707 m + 319.281 243.7707 319.9142 245.0766 319.9142 246.6875 c + 319.9142 248.2984 319.281 249.6043 318.5 249.6043 c + 317.719 249.6043 317.0858 248.2984 317.0858 246.6875 c + 317.0858 245.0766 317.719 243.7707 318.5 243.7707 c + f +} def + +/stripes { + 292 289 m + 252 294 241 295 213 279 c + 185 263 175 252 159 222 c + S + 285 313 m + 239 326 226 325 206 315 c + 186 305 164 278 161 267 c + S + 298 353 m + 262 342 251 339 237 355 c + 223 371 213 380 201 383 c + S + 330 288 m + 384 293 385 292 418 280 c + 451 268 452 264 473 247 c + S + 342 306 m + 381 311 386 317 410 311 c + 434 305 460 287 474 262 c + S + 345 321 m + 352 357 359 367 379 377 c + 399 387 409 385 426 382 c + S + 327.75 367.75 m + 336.5 392.25 333.682 403.348 335.25 415.5 c + S + 320 364.75 m + 322 361.75 323.5 360.5 326.25 360 c + 329 359.5 332 360.5 334 362.75 c + S + 316.25 356.5 m + 318.75 353.25 320 353 323.25 352.25 c + 326.5 351.5 329 352 331.5 353.25 c + S + 312.5 349 m + 316.75 345.5 318.25 344.5 321.25 343.75 c + 324.25 343 327 344 329.75 346 c + S + 310.75 340.75 m + 314.25 336.5 316.25 335.25 320 335.25 c + 323.75 335.25 327 336.5 329.25 338 c + S + 308.5 332 m + 311.75 328.5 312.5 327.25 317 327 c + 321.5 326.75 325.75 328.25 327.75 329.75 c + S + 305 322 m + 309.5 317.75 310.75 317 315 316.5 c + 319.25 316 322.25 318 324.75 320 c + S + 302.25 311 m + 307 307.5 307.75 306.25 312.75 306 c + 317.75 305.75 320 307.25 323.75 309.5 c + S + 301.25 298.25 m + 304.5 292.75 305.25 292 308.25 292 c + 311.25 292 313.75 293.75 315.75 295.75 c + S +} def +/nostrils { + 0 g + 304.062 227.775 m + 304.599 227.775 305.034 228.883 305.034 230.25 c + 305.034 231.616 304.599 232.724 304.062 232.724 c + 303.525 232.724 303.09 231.616 303.09 230.25 c + 303.09 228.883 303.525 227.775 304.062 227.775 c + f + 304.062 230.25 m + F + 309.562 228.275 m + 310.099 228.275 310.534 229.383 310.534 230.75 c + 310.534 232.116 310.099 233.224 309.562 233.224 c + 309.025 233.224 308.59 232.116 308.59 230.75 c + 308.59 229.383 309.025 228.275 309.562 228.275 c + f +} def +/thorax +{ + 327.5 300 m + 316.5 283 315.5 275.5 308 277.5 c + 294 311.5 299 313.5 304 334 c + 309 354.5 315.5 362 322.5 372 c + 329.5 382 327.5 376.5 331 376 c + 334.5 375.5 339.1367 379.1109 339 369 c + 338.5 332 333.4999 324.5 330.5 311.5 c + 0 g S +} def +/spots { + next_color + 192 242.201 m + 202.1535 242.201 210.3848 251.0655 210.3848 262 c + 210.3848 272.9345 202.1535 281.799 192 281.799 c + 181.8465 281.799 173.6152 272.9345 173.6152 262 c + 173.6152 251.0655 181.8465 242.201 192 242.201 c + FillStroke + next_color + 447.5 250.2365 m + 459.6061 250.2365 469.4203 257.5181 469.4203 266.5 c + 469.4203 275.4819 459.6061 282.7635 447.5 282.7635 c + 435.3939 282.7635 425.5797 275.4819 425.5797 266.5 c + 425.5797 257.5181 435.3939 250.2365 447.5 250.2365 c + FillStroke + next_color + 401 369.1005 m + 409.5914 369.1005 416.5563 373.5327 416.5563 379 c + 416.5563 384.4673 409.5914 388.8995 401 388.8995 c + 392.4086 388.8995 385.4436 384.4673 385.4436 379 c + 385.4436 373.5327 392.4086 369.1005 401 369.1005 c + FillStroke + next_color + 249 348.2721 m + 261.4966 348.2721 271.6274 353.9707 271.6274 361 c + 271.6274 368.0293 261.4966 373.7279 249 373.7279 c + 236.5034 373.7279 226.3726 368.0293 226.3726 361 c + 226.3726 353.9707 236.5034 348.2721 249 348.2721 c + FillStroke +} def + +/ncolor 6 def +/cidx 0 def + +/next_color { + cidx ncolor div % hue + .75 % saturation (change these if you like) + .8 % lightness + sethsbcolor + /cidx cidx 1 add ncolor mod def +} def + +/cidx 0 def + +/max_r2 % radius^2 for center of outermost ring of butterflies + Dm nlayers mul 1.05 mul dup mul +def + +/max_radius max_r2 sqrt def +/max_radius_inv 1 max_radius div def +/Dm_inv 1 Dm div def + +% +% Ellipsoidal distortion, maps "nlayers" concentric rings of cells into +% an ellipse centered on page + +% D length of 1 basis vector separating hexagonal cells +% z0 center of 6-fold rotation = origin of shrink xform +% z' = (z - z0)/D new coord system +% |z'| = sqrt(x^2 + [(8.5/11)*y]^2) aspect ratio of paper +% z" = z' * a/M(|z'|) shrink by "a/M(|z|)" as fcn of radius + +% At the max radius, we want the shrunk ellipse to be "W" units wide so it +% just fits our output format - solve for scale factor "a" + +% zmax = n+0.5 for n layers of cells +% zmax * [a/M(zmax)] = W 1/2 width of output on paper +% a = M(zmax)*W/zmax solve for "a" + +%/M{dup mul 1 add sqrt}bind def % M(u) = sqrt(1+|u|^2) = one possible shrink +/M { 1.5 add } bind def % M(u) = (1.5+|u|) = another possible one +/W 3.8 inch def % 1/2 width of ellipse +/zmax 0.5 nlayers add def % radius at last layer of hexagons +/a zmax M W mul zmax div def % a = M(zmax)*W/zmax + +/Xform { % [x0,y0] = ctr ellipse + Matrix transform + /y exch def + /x exch def + /z x dup mul y .773 mul dup mul add sqrt def % ellipse radius + /Scale a z M div def % z=a/M(|z|) + x Scale mul x0 add % magnify back up + y Scale mul y0 add % [x0+x*s, y0+y*s] +} bind def + + +/Helvetica findfont 8 scalefont setfont +4.25 inch 0.5 inch moveto +(RHW) stringwidth pop -0.5 mul 0 rmoveto +(RHW) show % autograph + +warp 1 eq { % redefine commands to use Xform + /moveto { Xform moveto} bind def + /lineto { Xform lineto} bind def + /curveto { + Xform 6 -2 roll + Xform 6 -2 roll + Xform 6 -2 roll + curveto + } bind def +}if + + +/bfly { % paint 1 butterfly + next_color body + 1 setgray eyes + stripes + 0 setgray nostrils + 0.5 setgray thorax next_color + spots +} def + +/x0 x4 def % center +/y0 y4 def + +/T1matrix % xlate to center of image + x0 neg y0 neg matrix translate +def + +/Smatrix % scale so that 1 basis vector = 1.0 + Dm_inv dup matrix scale +def + +/HexCell { % 6 butterflys rotated about center of + /cidx 0 def % 6 fold symmetry + /color 0 def + /T2matrix dx dy matrix translate def + 0 60 300 { + /angle exch def + /Rmatrix angle matrix rotate def + /Matrix % translate, rotate, scale - used by Xform + T1matrix Rmatrix matrix concatmatrix + T2matrix matrix concatmatrix + Smatrix matrix concatmatrix + def + gsave + warp 0 eq % then may use usual PostScript machinery + { % else using Xform + x0 y0 translate angle rotate + .5 dup scale + dx x0 sub dy y0 sub translate + } if + bfly + next_color + grestore + } for +} def + + +%320 x4 sub 240 y4 sub translate +4.25 inch x4 sub 5.5 inch y4 sub translate + + +0 setlinewidth +/N 2 def +N neg 1 N { + /i exch def % translate to + N neg 1 N { % i*D1 + j*D2 + /j exch def % and draw HexCell + gsave + /dx i D1x mul j D2x mul add def % translate HexCell by + /dy i D1y mul j D2y mul add def % [dx,dy] + /r2 dx dup mul dy dup mul add def % r^2 = |dx,dy|^2 + r2 max_r2 lt % inside radius? + { % yes + 1 r2 max_r2 div sub sqrt 2 div + setlinewidth % make skinnier lines + HexCell % 6 butterflies + } + if + grestore + } for +} for + +showpage + -- cgit v1.2.3