cantor_carpets 0.0.1

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.
data/lib/array2d.rb ADDED
@@ -0,0 +1,95 @@
1
+ class Array2D
2
+ attr_accessor :state
3
+
4
+ def initialize(rows, columns, value=nil)
5
+ @state = Array.new(rows) { Array.new(columns) { value } }
6
+ end
7
+
8
+ def each(&block)
9
+ @state.each do |row|
10
+ row.each do |e|
11
+ yield e
12
+ end
13
+ end
14
+ end
15
+
16
+ def each_with_index(&block)
17
+ @state.each_with_index do |row, row_index|
18
+ row.each_with_index do |e, column_index|
19
+ yield e, [row_index, column_index]
20
+ end
21
+ end
22
+ end
23
+
24
+ def to_s
25
+ @state.to_s
26
+ end
27
+
28
+ def ==(o)
29
+ o.class == self.class && o.state == state
30
+ end
31
+
32
+ def size
33
+ [@state.size, @state[0].size]
34
+ end
35
+
36
+ def row_size
37
+ @state.size
38
+ end
39
+
40
+ def column_size
41
+ @state[0].size
42
+ end
43
+
44
+ def []=(x, y, value)
45
+ case x
46
+ when Integer
47
+ case y
48
+ when Integer
49
+ @state[x][y] = value
50
+ when Range
51
+ y.each {|yi| @state[x][yi] = value[yi - y.first]}
52
+ end
53
+ when Range
54
+ case y
55
+ when Integer
56
+ x.each {|xi| @state[xi][y] = value[xi - x.first]}
57
+ when Range
58
+ x.each do |xi|
59
+ y.each do |yi|
60
+ @state[xi][yi] = value[xi - x.first, yi - y.first]
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
66
+
67
+ def [](x, y)
68
+ case x
69
+ when Integer
70
+ case y
71
+ when Integer
72
+ @state[x][y]
73
+ when Range
74
+ subarray = Array.new(y.to_a.size)
75
+ y.each {|yi| subarray[yi - y.first] = @state[x][yi]}
76
+ subarray
77
+ end
78
+ when Range
79
+ case y
80
+ when Integer
81
+ subarray = Array.new(x.to_a.size)
82
+ x.each {|xi| subarray[xi - x.first] = @state[xi][y]}
83
+ subarray
84
+ when Range
85
+ subarray = Array2D.new(x.to_a.size, y.to_a.size)
86
+ x.each do |xi|
87
+ y.each do |yi|
88
+ subarray.state[xi - x.first][yi - y.first] = @state[xi][yi]
89
+ end
90
+ end
91
+ subarray
92
+ end
93
+ end
94
+ end
95
+ end
@@ -0,0 +1 @@
1
+ require_relative 'carpet'
data/lib/carpet.rb ADDED
@@ -0,0 +1,56 @@
1
+ require 'png'
2
+ require_relative 'array2d'
3
+
4
+ class Carpet
5
+ attr_reader :seed, :depth, :bits, :image
6
+
7
+ def initialize(seed, depth)
8
+ @seed = seed
9
+ @depth = depth
10
+ compute_carpet
11
+ end
12
+
13
+ def compute_carpet
14
+ @bits = calculate_bits(new_bit_array)
15
+ @image = create_image
16
+ end
17
+
18
+ def new_bit_array
19
+ Array2D.new(@seed.row_size ** @depth,
20
+ @seed.column_size ** @depth, 0)
21
+ end
22
+
23
+ def calculate_bits(bit_array)
24
+ if bit_array.size == @seed.size
25
+ return @seed
26
+ end
27
+
28
+ row_chunk = bit_array.row_size / @seed.row_size
29
+ col_chunk = bit_array.column_size / @seed.column_size
30
+
31
+ @seed.each_with_index do |e, index|
32
+ xi = index[0]
33
+ yi = index[1]
34
+ row_range = (row_chunk * xi)...(row_chunk * (xi + 1))
35
+ column_range = (col_chunk * yi)...(col_chunk * (yi + 1))
36
+ if e == 1
37
+ bit_array[row_range, column_range] = calculate_bits(bit_array[row_range, column_range])
38
+ end
39
+ end
40
+ bit_array
41
+ end
42
+
43
+ def create_image
44
+ canvas = PNG::Canvas.new(@seed.column_size ** @depth,
45
+ @seed.row_size ** @depth,
46
+ PNG::Color::White)
47
+ canvas.each do |x, y, color|
48
+ canvas[x, y] = PNG::Color::Black if @bits[-y, x] == 1
49
+ end
50
+ PNG.new(canvas)
51
+ end
52
+
53
+ def write_image(name='carpet.png')
54
+ @image.save(name)
55
+ end
56
+ end
metadata ADDED
@@ -0,0 +1,48 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cantor_carpets
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Luke Grecki
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-09-28 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: You can generate cantor dust, sierpinski carpet, and other 2D cantor
15
+ sets.
16
+ email: lukegrecki@gmail.com
17
+ executables: []
18
+ extensions: []
19
+ extra_rdoc_files: []
20
+ files:
21
+ - lib/array2d.rb
22
+ - lib/cantor_carpets.rb
23
+ - lib/carpet.rb
24
+ homepage: http://rubygems.org/gems/cantor_carpets
25
+ licenses: []
26
+ post_install_message:
27
+ rdoc_options: []
28
+ require_paths:
29
+ - lib
30
+ required_ruby_version: !ruby/object:Gem::Requirement
31
+ none: false
32
+ requirements:
33
+ - - ! '>='
34
+ - !ruby/object:Gem::Version
35
+ version: '0'
36
+ required_rubygems_version: !ruby/object:Gem::Requirement
37
+ none: false
38
+ requirements:
39
+ - - ! '>='
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ requirements: []
43
+ rubyforge_project:
44
+ rubygems_version: 1.8.11
45
+ signing_key:
46
+ specification_version: 3
47
+ summary: Generate images of 2D cantor sets
48
+ test_files: []