chiark / gitweb /
lines
[quacks.git] / overflow-tube.ps.pl
1 #!/usr/bin/perl -w
2 # Books of Pumpkins, etc.  Extensions to Quacks of Quedlinburg
3 #  SPDX-License-Identifier: GPL-3.0-or-later OR CC-BY-SA-4.0
4 # Copyright 2020-2022 Ian Jackson
5
6 use strict;
7
8 BEGIN { unshift @INC, '.'; }
9 use Quacks;
10
11 sub o {
12   local $_;
13   for (@_) { $ps_framing .= $_ }
14 }
15
16 ps_start(<<END);
17 %90 rotate
18 %0 -210 translate
19 END
20
21 my $x_cut = 27;
22 my $y_cutd = 10;
23
24 my $nrepis = 4;
25
26 my $paper_x = 210;
27
28 my $spacing = 23;
29 my $colspacing = 23;
30 my $vhalf = sqrt( $spacing ** 2 - ($colspacing*0.5) ** 2 );
31
32 my $y_cut = 2.75 * $spacing;
33
34 my $x_pl_zero = $paper_x*0.5 - 3*$colspacing;
35 my $y_pl_zero = $y_cut + $spacing - $y_cutd* 0.5 * $x_cut/$colspacing;
36
37 my $y_top = $y_pl_zero + $y_cutd + $spacing*1.25;
38
39 sub some_cut_line($) {
40   <<END;
41 gsave
42   0.5 setgray
43   $_[0]
44 grestore
45 END
46 }
47
48
49 o <<GS, some_cut_line(<<GR), <<END;
50 /cut_line {
51 GS
52                               newpath
53   $x_cut 0                    moveto
54   $x_cut $y_cut               lineto
55   0      $y_cut $y_cutd add   lineto
56   0      $y_top               lineto
57                               stroke
58 GR
59 } def
60 END
61
62 sub places ($) {
63   my ($repi) = @_;
64   my $data = <<END;
65       -1-H -1
66         -1  0   34 14
67         -H  V   34 14 *
68          0  0   34 15
69          0 -1   35 15
70          0 -2   35 16
71          H -2-V 35 16 *
72          1 -2   36 16
73          1 -1   37 16
74        1+H  0
75 END
76   my $line;
77   my $line_word = 'moveto';
78
79   my $o = '';
80
81   $o .= <<END;
82     gsave
83     /Helvetica-Bold findfont 8 scalefont setfont
84 END
85   foreach (split /\n/, $data) {
86     s{\#.*}{};
87     next unless m/\S/;
88     s{^\s*}{};
89     s{H}{ 0.5 }ge;
90     s{V}{ $vhalf / $spacing }ge;
91     s{\*}{1}eg;
92     my ($x,$y,$money,$veeps,$ruby) = map { eval $_ } split /\s+/;
93     $ruby ||= 0;
94     $x *= $colspacing;
95     $y *= $spacing;
96     $x += $x_pl_zero;
97     $y += $y_pl_zero;
98
99     $line .= " $x $y $line_word";
100     $line_word = 'lineto';
101     next unless defined $money;
102
103     $money += 4 * $repi;
104     $veeps += 2 * $repi;
105
106     $o .= <<END;
107 % place $x $y $money $veeps $ruby
108 gsave
109   $x $y translate
110   gsave ${\ chip($anychip, 0) } grestore
111   -5 0 moveto ($money) show
112 grestore
113 END
114   }
115   $o .= <<END;
116     grestore
117 END
118
119   (" newpath $line stroke ", $o)
120 }
121
122 sub repis () {
123   for my $places_i (qw(0 1)) {
124     for my $repi (0..$nrepis-1) {
125       o(<<END);
126 % repi $places_i $repi
127 gsave
128   $repi $colspacing 2 mul mul  0 translate
129 END
130
131       o( (places($repi))[$places_i] );
132       o(<<END);
133 grestore
134 END
135     }
136   }
137 }
138
139 sub set () {
140   o(<<END);
141     cut_line
142     gsave
143       $paper_x $x_cut sub  0 translate
144       cut_line
145     grestore
146 END
147   o some_cut_line <<END;
148                                  newpath
149     0                    $y_top  moveto
150     $paper_x $x_cut sub  $y_top  lineto
151                                  stroke
152 END
153
154   repis();
155 }
156
157 set();
158
159 print $ps_framing or die $!;