amaze 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +9 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +4 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE.txt +21 -0
  7. data/README.md +110 -0
  8. data/Rakefile +6 -0
  9. data/amaze.gemspec +30 -0
  10. data/bin/console +15 -0
  11. data/bin/setup +8 -0
  12. data/exe/amaze +5 -0
  13. data/lib/amaze.rb +17 -0
  14. data/lib/amaze/algorithm.rb +44 -0
  15. data/lib/amaze/algorithm/aldous_border.rb +36 -0
  16. data/lib/amaze/algorithm/binary_tree.rb +20 -0
  17. data/lib/amaze/algorithm/growing_tree.rb +52 -0
  18. data/lib/amaze/algorithm/hunt_and_kill.rb +53 -0
  19. data/lib/amaze/algorithm/recursive_backtracker.rb +77 -0
  20. data/lib/amaze/algorithm/sidewinder.rb +42 -0
  21. data/lib/amaze/algorithm/wilson.rb +54 -0
  22. data/lib/amaze/cell.rb +63 -0
  23. data/lib/amaze/cell/hex.rb +10 -0
  24. data/lib/amaze/cell/octo.rb +10 -0
  25. data/lib/amaze/cell/polar.rb +16 -0
  26. data/lib/amaze/cell/square.rb +10 -0
  27. data/lib/amaze/distances.rb +53 -0
  28. data/lib/amaze/factory.rb +153 -0
  29. data/lib/amaze/formatter.rb +5 -0
  30. data/lib/amaze/formatter/ascii.rb +91 -0
  31. data/lib/amaze/formatter/ascii/delta.rb +180 -0
  32. data/lib/amaze/formatter/ascii/ortho.rb +105 -0
  33. data/lib/amaze/formatter/ascii/polar.rb +199 -0
  34. data/lib/amaze/formatter/ascii/sigma.rb +213 -0
  35. data/lib/amaze/formatter/ascii/upsilon.rb +281 -0
  36. data/lib/amaze/formatter/image.rb +127 -0
  37. data/lib/amaze/formatter/image/delta.rb +123 -0
  38. data/lib/amaze/formatter/image/ortho.rb +103 -0
  39. data/lib/amaze/formatter/image/polar.rb +173 -0
  40. data/lib/amaze/formatter/image/sigma.rb +122 -0
  41. data/lib/amaze/formatter/image/upsilon.rb +135 -0
  42. data/lib/amaze/grid.rb +66 -0
  43. data/lib/amaze/grid/delta.rb +87 -0
  44. data/lib/amaze/grid/ortho.rb +38 -0
  45. data/lib/amaze/grid/polar.rb +61 -0
  46. data/lib/amaze/grid/sigma.rb +61 -0
  47. data/lib/amaze/grid/upsilon.rb +74 -0
  48. data/lib/amaze/mask.rb +75 -0
  49. data/lib/amaze/masked_grid.rb +29 -0
  50. data/lib/amaze/script.rb +361 -0
  51. data/lib/amaze/shape.rb +23 -0
  52. data/lib/amaze/shape/diamond.rb +26 -0
  53. data/lib/amaze/shape/hexagon.rb +79 -0
  54. data/lib/amaze/shape/star.rb +114 -0
  55. data/lib/amaze/shape/triangle.rb +25 -0
  56. data/lib/amaze/version.rb +3 -0
  57. data/support/characters.txt +17 -0
  58. data/support/mask/mask1.txt +10 -0
  59. data/support/mask/mask2.txt +12 -0
  60. data/support/mask/mask3.txt +15 -0
  61. metadata +203 -0
@@ -0,0 +1,213 @@
1
+
2
+ class Amaze::Formatter::ASCII::Sigma < Amaze::Formatter::ASCII
3
+
4
+ def draw_cell cell
5
+ x0, y0 = coord cell
6
+ x1 = x0 + cell_size
7
+ x2 = x0 + cell_size + cell_size * 3
8
+ y1 = y0 + cell_size
9
+
10
+ 0.upto(cell_size*3-1) do |i|
11
+ # north
12
+ char[y0][x1+i] = n.color(grid_color) unless cell.linked_to?(:north)
13
+ # south
14
+ char[y0+cell_size*2][x1+i] = s.color(grid_color) unless cell.linked_to?(:south)
15
+ end
16
+
17
+ 0.upto(cell_size-1) do |i|
18
+ # north east
19
+ char[y0+1+i][x2+i] = ne.color(grid_color) unless cell.linked_to?(:northeast)
20
+ # north west
21
+ char[y0+1+i][x0+cell_size-1-i] = nw.color(grid_color) unless cell.linked_to?(:northwest)
22
+ # south east
23
+ char[y1+1+i][x2+cell_size-1-i] = se.color(grid_color) unless cell.linked_to?(:southeast)
24
+ # south west
25
+ char[y1+1+i][x0+i] = sw.color(grid_color) unless cell.linked_to?(:southwest)
26
+ end
27
+ end
28
+
29
+ def draw_content cell
30
+ x, y = coord cell
31
+ distance(cell).center(cell_size * 3).chars.each_with_index do |c,i|
32
+ char[y+cell_size][x+cell_size+i] = c.color(*distance_color(cell))
33
+ end
34
+ end
35
+
36
+ def draw_path cell
37
+ x, y = coord cell, :center
38
+ # north-south
39
+ 1.upto(cell_size*2) do |i|
40
+ char[y+i][x] = p.color(path_color)
41
+ end if path?(:south, cell)
42
+ # northwest-southeast
43
+ 0.upto(cell_size-1) do |i|
44
+ char[y+i][x+i*4] = p.color(path_color)
45
+ char[y+i+1][x+i*4+2] = pnwse.color(path_color)
46
+ end if path?(:southeast, cell)
47
+ # southwest-northeast
48
+ 0.upto(cell_size-1) do |i|
49
+ char[y-i][x+i*4] = p.color(path_color)
50
+ char[y-i][x+i*4+2] = pswne.color(path_color)
51
+ end if path?(:northeast, cell)
52
+ # center
53
+ char[y][x] = p.color(path_color)
54
+ end
55
+
56
+ def coord cell, ref=:topleft
57
+ x = xpos(cell.column)
58
+ y = ypos(cell.row, cell.column.odd?)
59
+ if ref == :center
60
+ x = x + cell_size * 3 / 2 + cell_size
61
+ y = y + cell_size
62
+ end
63
+ [x, y]
64
+ end
65
+
66
+ def xpos column
67
+ (cell_size * 4) * column
68
+ end
69
+
70
+ def ypos row, odd=false
71
+ offset = odd ? cell_size : 0
72
+ (cell_size * 2) * row + offset
73
+ end
74
+
75
+ def char_array_width
76
+ xpos(grid.columns) + cell_size
77
+ end
78
+
79
+ def char_array_height
80
+ ypos(grid.rows, true) + 1
81
+ end
82
+
83
+ def n
84
+ '_'
85
+ end
86
+
87
+ def ne
88
+ '\\'
89
+ end
90
+
91
+ def se
92
+ '/'
93
+ end
94
+
95
+ def p
96
+ '.'
97
+ end
98
+
99
+ def pnwse
100
+ '`'
101
+ end
102
+
103
+ def pswne
104
+ '´'
105
+ end
106
+
107
+ alias_method :s, :n
108
+ alias_method :sw, :ne
109
+ alias_method :nw, :se
110
+ end
111
+
112
+ __END__
113
+
114
+ .___.....___.....___.....
115
+ /...\___/...\___/...\___.
116
+ \___/...\___/...\___/...\
117
+ /...\___/...\___/...\___/
118
+ \___/...\___/...\___/...\
119
+ /...\___/...\___/...\___/
120
+ \___/...\___/...\___/....
121
+ ....\___/...\___/........
122
+
123
+
124
+ ..______..........______..........______..........
125
+ ./......\......../......\......../......\.........
126
+ /........\______/........\______/........\______..
127
+ \......../......\......../......\......../......\.
128
+ .\______/........\______/........\______/........\
129
+ ./......\......../......\......../......\......../
130
+ /........\______/........\______/........\______/.
131
+ \......../......\......../......\......../......\.
132
+ .\______/........\______/........\______/........\
133
+ ./......\......../......\......../......\......../
134
+ /........\______/........\______/........\______/.
135
+ \......../......\......../......\......../......\.
136
+ .\______/........\______/........\______/........\
137
+ ........\......../......\......../......\......../
138
+ .........\______/........\______/........\______/.
139
+
140
+
141
+ ..._________..............._________..............._________
142
+ ../.........\............./.........\............./.........\
143
+ ./...........\.........../...........\.........../...........\
144
+ /.............\_________/.............\_________/.............\_________
145
+ \............./.........\............./.........\............./.........\
146
+ .\.........../...........\.........../...........\.........../...........\
147
+ ..\_________/.............\_________/.............\_________/.............\
148
+ ../.........\............./.........\............./.........\............./
149
+ ./...........\.........../...........\.........../...........\.........../
150
+ /.............\_________/.............\_________/.............\_________/
151
+ \............./.........\............./.........\............./.........\
152
+ .\.........../...........\.........../...........\.........../...........\
153
+ ..\_________/.............\_________/.............\_________/.............\
154
+ ../.........\............./.........\............./.........\............./
155
+ ./...........\.........../...........\.........../...........\.........../
156
+ /.............\_________/.............\_________/.............\_________/
157
+ \............./.........\............./.........\............./.........\
158
+ .\.........../...........\.........../...........\.........../...........\
159
+ ..\_________/.............\_________/.............\_________/.............\
160
+ ............\............./.........\............./.........\............./
161
+ .............\.........../...........\.........../...........\.........../
162
+ ..............\_________/.............\_________/.............\_________/
163
+
164
+
165
+ ___ ___ ___
166
+ / . \___/ \___/ \___
167
+ \ . ` . \___/ . \___/ \
168
+ / . \___` . ´___/ \___/
169
+ \___/ \___/ \___/ \
170
+ / \___/ \___/ \___/
171
+ \___/ \___/ \___/
172
+ \___/ \___/
173
+
174
+
175
+ ______ ______ ______
176
+ / \ / \ / \
177
+ / . \______/ \______/ \______
178
+ \ . ` . \ / \ / \
179
+ \ . ` . \______/ . \______/ \
180
+ / . \ ` . . ´ / \ /
181
+ / . \______ ` . ´ ______/ \______/
182
+ \ . / \ / \ / \
183
+ \___.__/ \______/ \______/ \
184
+ / \ / \ / \ /
185
+ / \______/ \______/ \______/
186
+ \ / \ / \ / \
187
+ \______/ \______/ \______/ \
188
+ \ / \ / \ /
189
+ \______/ \______/ \______/
190
+
191
+
192
+ _________ _________ _________
193
+ / \ / \ / \
194
+ / \ / \ / \
195
+ / . \_________/ \_________/ \_________
196
+ \ . ` . \ / \ / \
197
+ \ . ` . \ / \ / \
198
+ \ . ` . \_________/ \_________/ \
199
+ / . \ ` . . / \ /
200
+ / . \ ` . . ´ / \ /
201
+ / . \_________ ` . ´ _________/ \_________/
202
+ \ / \ / \ / \
203
+ \ / \ / \ / \
204
+ \_________/ \_________/ \_________/ \
205
+ / \ / \ / \ /
206
+ / \ / \ / \ /
207
+ / \_________/ \_________/ \_________/
208
+ \ / \ / \ / \
209
+ \ / \ / \ / \
210
+ \_________/ \_________/ \_________/ \
211
+ \ / \ / \ /
212
+ \ / \ / \ /
213
+ \_________/ \_________/ \_________/
@@ -0,0 +1,281 @@
1
+
2
+ class Amaze::Formatter::ASCII::Upsilon < Amaze::Formatter::ASCII
3
+
4
+ def draw_cell cell
5
+ x0, x1, x2, x3, y0, y1, y2, y3 = coord cell
6
+
7
+ if (cell.row+cell.column).even?
8
+ # draw octo cell
9
+ # corners
10
+ char[y0][x1] = corner.color(grid_color)
11
+ char[y0][x2] = corner.color(grid_color)
12
+ char[y1][x0] = corner.color(grid_color)
13
+ char[y1][x3] = corner.color(grid_color)
14
+ char[y2][x0] = corner.color(grid_color)
15
+ char[y2][x3] = corner.color(grid_color)
16
+ char[y3][x1] = corner.color(grid_color)
17
+ char[y3][x2] = corner.color(grid_color)
18
+ 1.upto(cell_size) do |i|
19
+ # northeast
20
+ char[y0+i][x2+i] = ne.color(grid_color) unless cell.linked_to?(:northeast)
21
+ # southeast
22
+ char[y2+i][x3-i] = se.color(grid_color) unless cell.linked_to?(:southeast)
23
+ # southwest
24
+ char[y2+i][x0+i] = sw.color(grid_color) unless cell.linked_to?(:southwest)
25
+ # northwest
26
+ char[y0+i][x1-i] = nw.color(grid_color) unless cell.linked_to?(:northwest)
27
+ # east
28
+ char[y1+i][x3] = v.color(grid_color) unless cell.linked_to?(:east)
29
+ # west
30
+ char[y1+i][x0] = v.color(grid_color) unless cell.linked_to?(:west)
31
+ end
32
+ 1.upto(cell_size*3) do |i|
33
+ # north
34
+ char[y0][x1+i] = h.color(grid_color) unless cell.linked_to?(:north)
35
+ # south
36
+ char[y3][x1+i] = h.color(grid_color) unless cell.linked_to?(:south)
37
+ end
38
+ else
39
+ # draw square cell
40
+ # corners
41
+ char[y1][x1] = corner.color(grid_color)
42
+ char[y1][x2] = corner.color(grid_color)
43
+ char[y2][x1] = corner.color(grid_color)
44
+ char[y2][x2] = corner.color(grid_color)
45
+ 1.upto(cell_size) do |i|
46
+ # east
47
+ char[y1+i][x2] = v.color(grid_color) unless cell.linked_to?(:east)
48
+ # west
49
+ char[y1+i][x1] = v.color(grid_color) unless cell.linked_to?(:west)
50
+ end
51
+ 1.upto(cell_size*3) do |i|
52
+ # north
53
+ char[y1][x1+i] = h.color(grid_color) unless cell.linked_to?(:north)
54
+ # south
55
+ char[y2][x1+i] = h.color(grid_color) unless cell.linked_to?(:south)
56
+ end
57
+ end
58
+ end
59
+
60
+ def draw_content cell
61
+ x0, x1, x2, x3, y0, y1, y2, y3 = coord cell
62
+
63
+ y = y1 + (y2 - y1) / 2
64
+ distance(cell).center(cell_size * 3).chars.each_with_index do |c,i|
65
+ char[y][x1+1+i] = c.color(*distance_color(cell))
66
+ end
67
+ end
68
+
69
+ def draw_path cell
70
+ x0, x1, x2, x3, y0, y1, y2, y3 = coord cell
71
+
72
+ # middle of cell
73
+ mx0 = (x1 + x2) / 2
74
+ my0 = (y1 + y2) / 2
75
+
76
+ # delta to middle of neighbor cell
77
+ dx = cell_size * 4 + 2
78
+ dy = cell_size * 2 + 2
79
+
80
+ # north-south
81
+ 1.upto(dy-1) do |i|
82
+ char[my0+i][mx0] = v.color(path_color)
83
+ end if path?(:south, cell)
84
+ # west-east
85
+ 1.upto(dx-1) do |i|
86
+ char[my0][mx0+i] = h.color(path_color)
87
+ end if path?(:east, cell)
88
+
89
+ if (cell.column+cell.row).even?
90
+ # northwest-southeast
91
+ if path?(:southeast, cell)
92
+ mx1 = mx0 + dx / 2
93
+ my1 = my0 + dy / 2
94
+
95
+ char[my1][mx1] = center.color(path_color)
96
+ 1.upto(cell_size) do |i|
97
+ char[my0+i][mx0+i*2-1] = pnwse1.color(path_color)
98
+ char[my0+i][mx0+i*2] = pnwse2.color(path_color)
99
+ char[my1+i][mx1+i*2-1] = pnwse1.color(path_color)
100
+ char[my1+i][mx1+i*2] = pnwse2.color(path_color)
101
+ end
102
+ end
103
+ # northeast-southwest
104
+ if path?(:southwest, cell)
105
+ mx1 = mx0 - dx / 2
106
+ my1 = my0 + dy / 2
107
+
108
+ char[my1][mx1] = center.color(path_color)
109
+ 1.upto(cell_size) do |i|
110
+ char[my0+i][mx0-i*2+1] = pswne1.color(path_color)
111
+ char[my0+i][mx0-i*2] = pswne2.color(path_color)
112
+ char[my1+i][mx1-i*2+1] = pswne1.color(path_color)
113
+ char[my1+i][mx1-i*2] = pswne2.color(path_color)
114
+ end
115
+ end
116
+ end
117
+
118
+ # center
119
+ char[my0][mx0] = center.color(path_color)
120
+ end
121
+
122
+ # left, right, top, bottom
123
+ def coord cell
124
+ x0 = x(cell.column)
125
+ x1 = x0 + cell_size + 1
126
+ x2 = x1 + cell_size * 3 + 1
127
+ x3 = x2 + cell_size + 1
128
+ y0 = y(cell.row)
129
+ y1 = y0 + cell_size + 1
130
+ y2 = y1 + cell_size + 1
131
+ y3 = y2 + cell_size + 1
132
+ [x0, x1, x2, x3, y0, y1, y2, y3]
133
+ end
134
+
135
+ def x column
136
+ # x0 for octo cell
137
+ (cell_size * 4 + 2) * column
138
+ end
139
+
140
+ def y row
141
+ # y0 for octo cell
142
+ (cell_size * 2 + 2) * row
143
+ end
144
+
145
+ def char_array_width
146
+ x(grid.columns) + cell_size + 2
147
+ end
148
+
149
+ def char_array_height
150
+ y(grid.rows) + cell_size + 2
151
+ end
152
+
153
+ def h
154
+ '-'
155
+ end
156
+
157
+ def v
158
+ '|'
159
+ end
160
+
161
+ def ne
162
+ '\\'
163
+ end
164
+
165
+ def se
166
+ '/'
167
+ end
168
+
169
+ alias_method :sw, :ne
170
+ alias_method :nw, :se
171
+
172
+ def pnwse1
173
+ '`'
174
+ end
175
+
176
+ def pnwse2
177
+ '.'
178
+ end
179
+
180
+ def pswne1
181
+ '´'
182
+ end
183
+
184
+ alias_method :pswne2, :pnwse2
185
+
186
+ def center
187
+ '∙'
188
+ end
189
+
190
+ def corner
191
+ '+'
192
+ end
193
+ end
194
+
195
+ __END__
196
+
197
+ x y
198
+ c1 0 6 12 4 8 12 4 4 2
199
+ c2 0 10 20 6 12 18 8 6 4
200
+ c3 0 14 28 8 16 24 12 8 6
201
+
202
+ +---+ +---+ +---+
203
+ / \ / \ / \
204
+ + +---+ +---+ +---+
205
+ | ∙-----∙ | ∙ | | | |
206
+ + `. +---+ .´| +---+ +---+
207
+ \ ∙ ∙ | / \ / \
208
+ +---+ `. .´ + | + +---+ +
209
+ | | ∙ | ∙ | | | |
210
+ +---+ +---+ +---+ +
211
+ / \ / \ / \ /
212
+ + +---+ +---+ +---+
213
+ | | | | | | |
214
+ + +---+ +---+ +---+
215
+ \ / \ / \ / \
216
+ +---+ +---+ +---+ +
217
+ | | | | | | |
218
+ +---+ +---+ +---+ +
219
+ / \ / \ / \ /
220
+ + +---+ +---+ +---+
221
+ | | | | | | |
222
+ + +---+ +---+ +---+
223
+ \ / \ / \ /
224
+ +---+ +---+ +---+
225
+
226
+ +------+ +------+ +------+
227
+ / \ / \ / \
228
+ / \ / \ / \
229
+ + +------+ +------+ +------+
230
+ | ∙---------∙ | ∙ | | | |
231
+ | `. | .´| | | | |
232
+ + `. +------+ .´ | +------+ +------+
233
+ \ ∙ ∙ | / \ / \
234
+ \ `. .´ | / \ / \
235
+ +------+ `. .´ + | + +------+ +
236
+ | | ∙ | ∙ | | | |
237
+ | | | | | | |
238
+ +------+ +------+ +------+ +
239
+ / \ / \ / \ /
240
+ / \ / \ / \ /
241
+ + +------+ +------+ +------+
242
+ | | | | | | |
243
+ | | | | | | |
244
+ + +------+ +------+ +------+
245
+ \ / \ / \ / \
246
+ \ / \ / \ / \
247
+ +------+ +------+ +------+ +
248
+ | | | | | | |
249
+ | | | | | | |
250
+ +------+ +------+ +------+ +
251
+ / \ / \ / \ /
252
+ / \ / \ / \ /
253
+ + +------+ +------+ +------+
254
+ | | | | | | |
255
+ | | | | | | |
256
+ + +------+ +------+ +------+
257
+ \ / \ / \ /
258
+ \ / \ / \ /
259
+ +------+ +------+ +------+
260
+
261
+ +---------+ +---------+ +---------+
262
+ / \ / \ / \
263
+ / \ / \ / \
264
+ / \ / \ / \
265
+ + +---------+ +---------+ +---------+
266
+ | | | | | |
267
+ | ∙-------------∙ | ∙ | | | |
268
+ | `. | .´| | | | |
269
+ + `. +---------+ .´ | +---------+ +---------+
270
+ \ `. .´ | / \ / \
271
+ \ ∙ ∙ | / \ / \
272
+ \ `. .´ | / \ / \
273
+ +---------+ `. .´ + | + +---------+ +
274
+ | | `. .´ | | | | |
275
+ | | ∙ | ∙ | | |
276
+ | | | | | |
277
+ +---------+ +---------+ +---------+
278
+ / \ / \ / \
279
+ / \ / \ / \
280
+ / \ / \ / \
281
+ + +---------+ +---------+ +---------+