cantor_carpets 0.0.2 → 0.1.2
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/.rbenv-version +1 -0
- data/Gemfile +14 -0
- data/Gemfile.lock +32 -0
- data/LICENSE.txt +20 -0
- data/README.markdown +34 -0
- data/Rakefile +45 -0
- data/VERSION +1 -0
- data/images/cross.png +0 -0
- data/images/dust.png +0 -0
- data/images/sierpenski.png +0 -0
- data/lib/cantor_carpets.rb +56 -1
- data/test/helper.rb +14 -0
- data/test/test_cantor_carpets.rb +30 -0
- metadata +94 -16
- data/lib/array2d.rb +0 -95
- data/lib/carpet.rb +0 -56
data/.rbenv-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
1.9.3-p0
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
GEM
|
2
|
+
remote: https://rubygems.org/
|
3
|
+
specs:
|
4
|
+
RubyInline (3.11.3)
|
5
|
+
ZenTest (~> 4.3)
|
6
|
+
ZenTest (4.8.2)
|
7
|
+
array_2d (0.1.1)
|
8
|
+
git (1.2.5)
|
9
|
+
hoe (3.0.8)
|
10
|
+
rake (~> 0.8)
|
11
|
+
jeweler (1.8.4)
|
12
|
+
bundler (~> 1.0)
|
13
|
+
git (>= 1.2.5)
|
14
|
+
rake
|
15
|
+
rdoc
|
16
|
+
json (1.7.5)
|
17
|
+
png (1.2.0)
|
18
|
+
rake (0.9.2.2)
|
19
|
+
rdoc (3.12)
|
20
|
+
json (~> 1.4)
|
21
|
+
|
22
|
+
PLATFORMS
|
23
|
+
ruby
|
24
|
+
|
25
|
+
DEPENDENCIES
|
26
|
+
RubyInline
|
27
|
+
array_2d
|
28
|
+
bundler
|
29
|
+
hoe
|
30
|
+
jeweler
|
31
|
+
png
|
32
|
+
rdoc
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2012 Luke Grecki
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.markdown
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
cantor_carpets
|
2
|
+
==============
|
3
|
+
|
4
|
+
Install
|
5
|
+
-------
|
6
|
+
|
7
|
+
gem install cantor_carpets
|
8
|
+
|
9
|
+
Usage
|
10
|
+
-----
|
11
|
+
|
12
|
+
Each fractal (called a Carpet) is determined by a seed and a depth. The seed is a
|
13
|
+
2D array that determines which squares are removed, and the depth determines the
|
14
|
+
resolution of the image. The resulting image is a PNG.
|
15
|
+
|
16
|
+
seed = Array2D.new(3, 3)
|
17
|
+
|
18
|
+
seed.state = [[1, 1, 1], [1, 0, 1], [1, 1, 1]]
|
19
|
+
carpet = Carpet.new(seed, 6)
|
20
|
+
carpet.write_image('sierpenski.png')
|
21
|
+
|
22
|
+

|
23
|
+
|
24
|
+
seed.state = [[1, 0, 1], [0, 0, 0], [1, 0, 1]]
|
25
|
+
carpet = Carpet.new(seed, 6)
|
26
|
+
carpet.write_image('dust.png')
|
27
|
+
|
28
|
+

|
29
|
+
|
30
|
+
seed.state = [[0, 1, 0], [1, 1, 1], [0, 1, 0]]
|
31
|
+
carpet = Carpet.new(seed, 6)
|
32
|
+
carpet.write_image('cross.png')
|
33
|
+
|
34
|
+

|
data/Rakefile
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'bundler'
|
5
|
+
begin
|
6
|
+
Bundler.setup(:default, :development)
|
7
|
+
rescue Bundler::BundlerError => e
|
8
|
+
$stderr.puts e.message
|
9
|
+
$stderr.puts "Run `bundle install` to install missing gems"
|
10
|
+
exit e.status_code
|
11
|
+
end
|
12
|
+
require 'rake'
|
13
|
+
|
14
|
+
require 'jeweler'
|
15
|
+
Jeweler::Tasks.new do |gem|
|
16
|
+
# gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
|
17
|
+
gem.name = "cantor_carpets"
|
18
|
+
gem.homepage = "http://github.com/lukegrecki/cantor_carpets"
|
19
|
+
gem.license = "MIT"
|
20
|
+
gem.summary = "A ruby library for creating 2D cantor sets."
|
21
|
+
gem.description = "A ruby library for creating 2D cantor sets."
|
22
|
+
gem.email = "lukegrecki@gmail.com"
|
23
|
+
gem.authors = ["Luke Grecki"]
|
24
|
+
# dependencies defined in Gemfile
|
25
|
+
end
|
26
|
+
Jeweler::RubygemsDotOrgTasks.new
|
27
|
+
|
28
|
+
require 'rake/testtask'
|
29
|
+
Rake::TestTask.new(:test) do |test|
|
30
|
+
test.libs << 'lib' << 'test'
|
31
|
+
test.pattern = 'test/**/test_*.rb'
|
32
|
+
test.verbose = true
|
33
|
+
end
|
34
|
+
|
35
|
+
task :default => :test
|
36
|
+
|
37
|
+
require 'rdoc/task'
|
38
|
+
Rake::RDocTask.new do |rdoc|
|
39
|
+
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
40
|
+
|
41
|
+
rdoc.rdoc_dir = 'rdoc'
|
42
|
+
rdoc.title = "cantor_carpets #{version}"
|
43
|
+
rdoc.rdoc_files.include('README*')
|
44
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
45
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.1.2
|
data/images/cross.png
ADDED
Binary file
|
data/images/dust.png
ADDED
Binary file
|
Binary file
|
data/lib/cantor_carpets.rb
CHANGED
@@ -1 +1,56 @@
|
|
1
|
-
|
1
|
+
require 'png'
|
2
|
+
require 'array_2d'
|
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
|
data/test/helper.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler'
|
3
|
+
begin
|
4
|
+
Bundler.setup(:default, :development)
|
5
|
+
rescue Bundler::BundlerError => e
|
6
|
+
$stderr.puts e.message
|
7
|
+
$stderr.puts "Run `bundle install` to install missing gems"
|
8
|
+
exit e.status_code
|
9
|
+
end
|
10
|
+
require 'test/unit'
|
11
|
+
|
12
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
13
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
14
|
+
require 'cantor_carpets'
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class CantorCarpetsTest < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
@seed = Array2D.new(2, 3)
|
6
|
+
@seed.state = [[1, 0, 1], [0, 1, 0]]
|
7
|
+
@depth = 2
|
8
|
+
@carpet = Carpet.new(@seed, @depth)
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_initialize
|
12
|
+
assert_instance_of(Carpet, Carpet.new(@seed, @depth))
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_bits
|
16
|
+
desired_array = Array2D.new(4, 9)
|
17
|
+
desired_array[0, 0...9] = [1, 0, 1, 0, 0, 0, 1, 0, 1]
|
18
|
+
desired_array[1, 0...9] = [0, 1, 0, 0, 0, 0, 0, 1, 0]
|
19
|
+
desired_array[2, 0...9] = [0, 0, 0, 1, 0, 1, 0, 0, 0]
|
20
|
+
desired_array[3, 0...9] = [0, 0, 0, 0, 1, 0, 0, 0, 0]
|
21
|
+
assert_equal(desired_array, @carpet.bits)
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_write_image
|
25
|
+
seed = Array2D.new(3, 3)
|
26
|
+
seed.state = [[1, 0, 1], [0, 0, 0],[1, 0, 1]]
|
27
|
+
carpet = Carpet.new(seed, 6)
|
28
|
+
carpet.write_image('test/carpet.png')
|
29
|
+
end
|
30
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cantor_carpets
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.1.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,14 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-10-08 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
|
-
name:
|
16
|
-
|
17
|
-
- hoe
|
18
|
-
- RubyInline
|
19
|
-
requirement: &70453820 !ruby/object:Gem::Requirement
|
15
|
+
name: png
|
16
|
+
requirement: &81937080 !ruby/object:Gem::Requirement
|
20
17
|
none: false
|
21
18
|
requirements:
|
22
19
|
- - ! '>='
|
@@ -24,19 +21,97 @@ dependencies:
|
|
24
21
|
version: '0'
|
25
22
|
type: :runtime
|
26
23
|
prerelease: false
|
27
|
-
version_requirements: *
|
28
|
-
|
29
|
-
|
24
|
+
version_requirements: *81937080
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: hoe
|
27
|
+
requirement: &81936770 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *81936770
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: array_2d
|
38
|
+
requirement: &81936480 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
type: :runtime
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *81936480
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: RubyInline
|
49
|
+
requirement: &81936220 !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
type: :runtime
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: *81936220
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: rdoc
|
60
|
+
requirement: &81935960 !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
62
|
+
requirements:
|
63
|
+
- - ! '>='
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '0'
|
66
|
+
type: :development
|
67
|
+
prerelease: false
|
68
|
+
version_requirements: *81935960
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: bundler
|
71
|
+
requirement: &81935680 !ruby/object:Gem::Requirement
|
72
|
+
none: false
|
73
|
+
requirements:
|
74
|
+
- - ! '>='
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
77
|
+
type: :development
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: *81935680
|
80
|
+
- !ruby/object:Gem::Dependency
|
81
|
+
name: jeweler
|
82
|
+
requirement: &81935390 !ruby/object:Gem::Requirement
|
83
|
+
none: false
|
84
|
+
requirements:
|
85
|
+
- - ! '>='
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: '0'
|
88
|
+
type: :development
|
89
|
+
prerelease: false
|
90
|
+
version_requirements: *81935390
|
91
|
+
description: A ruby library for creating 2D cantor sets.
|
30
92
|
email: lukegrecki@gmail.com
|
31
93
|
executables: []
|
32
94
|
extensions: []
|
33
|
-
extra_rdoc_files:
|
95
|
+
extra_rdoc_files:
|
96
|
+
- LICENSE.txt
|
97
|
+
- README.markdown
|
34
98
|
files:
|
35
|
-
-
|
99
|
+
- .rbenv-version
|
100
|
+
- Gemfile
|
101
|
+
- Gemfile.lock
|
102
|
+
- LICENSE.txt
|
103
|
+
- README.markdown
|
104
|
+
- Rakefile
|
105
|
+
- VERSION
|
106
|
+
- images/cross.png
|
107
|
+
- images/dust.png
|
108
|
+
- images/sierpenski.png
|
36
109
|
- lib/cantor_carpets.rb
|
37
|
-
-
|
38
|
-
|
39
|
-
|
110
|
+
- test/helper.rb
|
111
|
+
- test/test_cantor_carpets.rb
|
112
|
+
homepage: http://github.com/lukegrecki/cantor_carpets
|
113
|
+
licenses:
|
114
|
+
- MIT
|
40
115
|
post_install_message:
|
41
116
|
rdoc_options: []
|
42
117
|
require_paths:
|
@@ -47,6 +122,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
47
122
|
- - ! '>='
|
48
123
|
- !ruby/object:Gem::Version
|
49
124
|
version: '0'
|
125
|
+
segments:
|
126
|
+
- 0
|
127
|
+
hash: 204020577
|
50
128
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
51
129
|
none: false
|
52
130
|
requirements:
|
@@ -58,5 +136,5 @@ rubyforge_project:
|
|
58
136
|
rubygems_version: 1.8.11
|
59
137
|
signing_key:
|
60
138
|
specification_version: 3
|
61
|
-
summary:
|
139
|
+
summary: A ruby library for creating 2D cantor sets.
|
62
140
|
test_files: []
|
data/lib/array2d.rb
DELETED
@@ -1,95 +0,0 @@
|
|
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
|
data/lib/carpet.rb
DELETED
@@ -1,56 +0,0 @@
|
|
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
|