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.
@@ -0,0 +1 @@
1
+ 1.9.3-p0
data/Gemfile ADDED
@@ -0,0 +1,14 @@
1
+ source 'https://rubygems.org'
2
+
3
+ ruby '1.9.3'
4
+
5
+ gem 'png'
6
+ gem 'hoe'
7
+ gem 'array_2d'
8
+ gem 'RubyInline'
9
+
10
+ group :development do
11
+ gem 'rdoc'
12
+ gem 'bundler'
13
+ gem 'jeweler'
14
+ end
@@ -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
@@ -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.
@@ -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
+ ![carpet](https://github.com/lukegrecki/cantor_carpets/raw/master/images/sierpenski.png)
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
+ ![dust](https://github.com/lukegrecki/cantor_carpets/raw/master/images/dust.png)
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
+ ![cross](https://github.com/lukegrecki/cantor_carpets/raw/master/images/cross.png)
@@ -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
Binary file
Binary file
Binary file
@@ -1 +1,56 @@
1
- require_relative 'carpet'
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
@@ -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.0.2
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-09-28 00:00:00.000000000 Z
12
+ date: 2012-10-08 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
- name:
16
- - png
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: *70453820
28
- description: You can generate cantor dust, sierpinski carpet, and other 2D cantor
29
- sets.
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
- - lib/array2d.rb
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
- - lib/carpet.rb
38
- homepage: http://rubygems.org/gems/cantor_carpets
39
- licenses: []
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: Generate images of 2D cantor sets
139
+ summary: A ruby library for creating 2D cantor sets.
62
140
  test_files: []
@@ -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
@@ -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