cantor_carpets 0.0.2 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -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