blf 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: e54c1065e6517f9f6e64c0e3994ef812b1373d9c
4
+ data.tar.gz: 1a4c38daa0c783db021e1190793c429c6f379959
5
+ SHA512:
6
+ metadata.gz: 392df518a812c00ca6fafd8c1f419cd714360cc323da699500649be50e0db04c59cacee60d82649b2da394525e0c29bf598e72ff54a01e322f6c8bbfb8caea54
7
+ data.tar.gz: acee7b8cc51cb9394d0a409b0f333d1480ad5858da571e046ad7f7b1dd4816770e1c9c0a0263a761e853cbf4255343d6edb96a458fc75f2dc9c08a614e1c8fd1
data/.gitignore ADDED
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ *.jpg
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.1.0-preview2
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in blf.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Masami Yonehara
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,54 @@
1
+ # BLF
2
+
3
+ 詰め込み問題のBLF法の実装
4
+
5
+ This is an implementation of Bottom-Left method for 2-Dimensional Strip Packing Problem.
6
+
7
+ ![](http://gyazo.com/1b8b7db3ee0c3aa859e61996a9f51bc0.png)
8
+
9
+ ## Installation
10
+
11
+ Add this line to your application's Gemfile:
12
+
13
+ gem 'blf'
14
+
15
+ And then execute:
16
+
17
+ $ bundle
18
+
19
+ Or install it yourself as:
20
+
21
+ $ gem install blf
22
+
23
+ ## Usage
24
+
25
+ ```ruby
26
+ require "blf"
27
+
28
+ # create the world.
29
+ world = BLF.create_world width: 500, height: 500
30
+
31
+ # add a block with coordinates.
32
+ world.add_block_with_location x: 60, y: 0, width: 50, height: 50
33
+
34
+ (1..50).each do |n|
35
+ w = Random.new(Random.new_seed).rand * 100 + 10
36
+ h = Random.new(Random.new_seed).rand * 100 + 10
37
+ # add a block without coordinates. this becomes a target of allocation.
38
+ world.add_block width: w, height: h
39
+ end
40
+
41
+ # do allocation to all the blocks without coordinates.
42
+ world.allocate_all
43
+
44
+ world.draw
45
+ ```
46
+
47
+
48
+ ## Contributing
49
+
50
+ 1. Fork it
51
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
52
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
53
+ 4. Push to the branch (`git push origin my-new-feature`)
54
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/blf.gemspec ADDED
@@ -0,0 +1,28 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'blf/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "blf"
8
+ spec.version = Blf::VERSION
9
+ spec.authors = ["Masami Yonehara"]
10
+ spec.email = ["zeitdiebe@gmail.com"]
11
+ spec.description = %q{This is an implementation of Bottom-Left method to 2-Dimensional Strip Packing Problem.}
12
+ spec.summary = %q{This is an implementation of Bottom-Left method to 2-Dimensional Strip Packing Problem.}
13
+ spec.homepage = ""
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_runtime_dependency "rmagick", "~> 2.0"
22
+ spec.add_runtime_dependency "activesupport"
23
+
24
+ spec.add_development_dependency "bundler", "~> 1.3"
25
+ spec.add_development_dependency "rake"
26
+ spec.add_development_dependency "rspec"
27
+ spec.add_development_dependency "pry"
28
+ end
@@ -0,0 +1,23 @@
1
+ require "blf"
2
+ require "pp"
3
+
4
+ # create the world.
5
+ world = BLF.create_world width: 500, height: 500
6
+
7
+ # add a block with coordinates.
8
+ world.add_block_with_location x: 60, y: 0, width: 50, height: 50
9
+
10
+ (1..50).each do |n|
11
+ w = Random.new(Random.new_seed).rand * 100 + 10
12
+ h = Random.new(Random.new_seed).rand * 100 + 10
13
+ # add a block without coordinates. this becomes a target of allocation.
14
+ world.add_block width: w, height: h
15
+ end
16
+
17
+ # do allocation to all the blocks without coordinates.
18
+ world.allocate_all
19
+
20
+ # `world.placed_blocks` return the coordinates of the allocated blocks.
21
+ pp world.placed_blocks[0]
22
+
23
+ world.draw
data/lib/blf.rb ADDED
@@ -0,0 +1,9 @@
1
+ require "blf/version"
2
+ require "blf/world"
3
+ require "blf/block"
4
+
5
+ module BLF
6
+ def self.create_world(args)
7
+ BLF::World.new width: args[:width], height: args[:height]
8
+ end
9
+ end
data/lib/blf/block.rb ADDED
@@ -0,0 +1,37 @@
1
+ require "active_support/all"
2
+
3
+
4
+ module BLF
5
+ class Block
6
+ attr_accessor :start_x, :start_y, :width, :height, :end_x, :end_y, :world
7
+
8
+ def initialize(args)
9
+ @start_x = args[:start_x] || 0
10
+ @start_y = args[:start_y] || 0
11
+ @width = args[:width] || 0
12
+ @height = args[:height] || 0
13
+ @world = args[:world]
14
+ end
15
+
16
+ def end_x
17
+ (@start_x + @width).presence || 0
18
+ end
19
+
20
+ def end_y
21
+ (@start_y + @height).presence || 0
22
+ end
23
+
24
+ def draw
25
+ dr = Draw.new
26
+ dr.stroke = "#ccddff"
27
+ dr.fill = "rgb(#{random*255}, #{random*255}, #{random*255})"
28
+ dr.stroke_width 1
29
+ dr.rectangle @start_x, @start_y, end_x, end_y
30
+ dr.draw @world.image
31
+ end
32
+
33
+ def random
34
+ Random.new(Random.new_seed).rand
35
+ end
36
+ end
37
+ end
data/lib/blf/test.rb ADDED
@@ -0,0 +1,17 @@
1
+ # ruby-1.9.3
2
+
3
+ input_times = gets.to_i
4
+
5
+ result = input_times.times.map do
6
+ input = gets.to_i
7
+ input.match /((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])[.]){3}(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])/
8
+ end
9
+
10
+ r = result.map do |e|
11
+ case
12
+ when e == true then 'True'
13
+ when e == false then 'False'
14
+ end
15
+ end
16
+
17
+ r.each {|e| print e}
@@ -0,0 +1,3 @@
1
+ module Blf
2
+ VERSION = "0.0.1"
3
+ end
data/lib/blf/world.rb ADDED
@@ -0,0 +1,126 @@
1
+ require 'rmagick'
2
+ include Magick
3
+
4
+
5
+ module BLF
6
+ class World
7
+ attr_reader :width, :height, :blocks, :image, :bl_stable_point_list, :unplaced_blocks, :placed_blocks
8
+
9
+ def initialize(args)
10
+ @width = args[:width]
11
+ @height = args[:height]
12
+ @unplaced_blocks = []
13
+ @placed_blocks = []
14
+ @bl_stable_point_list = []
15
+ end
16
+
17
+ def add_block(args)
18
+ @unplaced_blocks << Block.new(width: args[:width], height: args[:height], world: self)
19
+ end
20
+
21
+ def add_block_with_location(args)
22
+ @placed_blocks << Block.new(start_x: args[:x], start_y: args[:y], width: args[:width], height: args[:height], world: self)
23
+ end
24
+
25
+ def add_bl_stable_point_candidates(new_block)
26
+ @bl_stable_point_list << { x: new_block.end_x, y: 0, width: 0, height: new_block.start_y }
27
+ @bl_stable_point_list << { x: 0, y: new_block.end_y, width: new_block.start_x, height: 0 }
28
+
29
+ @placed_blocks.each_with_index do |placed_block, index|
30
+ if (placed_block.end_x <= new_block.start_x) && (placed_block.end_y > new_block.end_y)
31
+ @bl_stable_point_list << { x: placed_block.end_x, y: new_block.end_y, width: new_block.start_x - placed_block.end_x, height: placed_block.start_y - new_block.end_y }
32
+
33
+ elsif (new_block.end_x <= placed_block.start_x) && (new_block.end_y > placed_block.end_y)
34
+ @bl_stable_point_list << { x: new_block.end_x, y: placed_block.end_y, width: placed_block.start_x - new_block.end_x, height: new_block.start_y - placed_block.end_y }
35
+
36
+ elsif (new_block.end_x < placed_block.end_x) && (placed_block.end_y <= new_block.start_y)
37
+ @bl_stable_point_list << { x: new_block.end_x, y: placed_block.end_y, width: placed_block.start_x - new_block.end_x, height: new_block.start_y - placed_block.end_y }
38
+
39
+ elsif (placed_block.end_x < new_block.end_x) && (new_block.end_y <= placed_block.start_y)
40
+ @bl_stable_point_list << { x: placed_block.end_x, y: new_block.end_y, width: new_block.start_x - placed_block.end_x, height: placed_block.start_y - new_block.end_x }
41
+
42
+ end
43
+ end
44
+ end
45
+
46
+ def allocate new_block
47
+ @bl_stable_point_list.each do |point|
48
+ if stable?(point, new_block) &&
49
+ !overlapped?(start_x: point[:x], start_y: point[:y], width: new_block.width, height: new_block.height) &&
50
+ !beyond_area?(start_x: point[:x], start_y: point[:y], width: new_block.width, height: new_block.height)
51
+
52
+ new_block.start_x = point[:x]
53
+ new_block.start_y = point[:y]
54
+ @placed_blocks << new_block
55
+ break
56
+ end
57
+ end
58
+ end
59
+
60
+ def allocate_all
61
+ # 左上端をブロックの組み合わせごとに追加するのは無駄なので、ここで一回だけ追加する。
62
+ @bl_stable_point_list << { x: 0, y: 0, width: 0, height: 0 }
63
+
64
+ @placed_blocks.each do |block|
65
+ add_bl_stable_point_candidates block
66
+ end
67
+
68
+ @unplaced_blocks.length.times do
69
+ # BL候補点の配列の順番通りに配置を試すので、Bottom-Leftの規則に沿って、yが小さい順に並べ替える。
70
+ @bl_stable_point_list.sort! {|a, b| a[:y] <=> b[:y] }
71
+
72
+ block = @unplaced_blocks.shift
73
+ allocate block
74
+ add_bl_stable_point_candidates block
75
+ self.draw
76
+ end
77
+ end
78
+
79
+ def stable?(point, current_block)
80
+ if point[:width] <= 0
81
+ current_block.height >= point[:height]
82
+ elsif point[:height] <= 0
83
+ current_block.width >= point[:width]
84
+ else
85
+ current_block.width >= point[:width] && current_block.height >= point[:height]
86
+ end
87
+ end
88
+
89
+ def overlapped?(args)
90
+ start_x = args[:start_x]
91
+ start_y = args[:start_y]
92
+ end_x = args[:start_x] + args[:width]
93
+ end_y = args[:start_y] + args[:height]
94
+
95
+ @placed_blocks.map do |block|
96
+ block.start_x < end_x &&
97
+ block.start_y < end_y &&
98
+ start_x < block.end_x &&
99
+ start_y < block.end_y
100
+ end.any?
101
+ end
102
+
103
+ def beyond_area?(args)
104
+ end_x = args[:start_x] + args[:width]
105
+ end_y = args[:start_y] + args[:height]
106
+ !(end_x <= self.width && end_y <= self.height)
107
+ end
108
+
109
+ def draw
110
+ @image = Image.new(@width, @height) do
111
+ self.background_color = 'white'
112
+ end
113
+
114
+ @placed_blocks.each {|block| block.draw }
115
+
116
+ @bl_stable_point_list.compact.each do |point|
117
+ dr = Draw.new
118
+ dr.fill = "black"
119
+ dr.ellipse(point[:x], point[:y], 1, 1, 0, 360)
120
+ dr.draw @image
121
+ end
122
+
123
+ @image.write("example.jpg")
124
+ end
125
+ end
126
+ end
metadata ADDED
@@ -0,0 +1,143 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: blf
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Masami Yonehara
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-12-08 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rmagick
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: activesupport
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.3'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.3'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: pry
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ description: This is an implementation of Bottom-Left method to 2-Dimensional Strip
98
+ Packing Problem.
99
+ email:
100
+ - zeitdiebe@gmail.com
101
+ executables: []
102
+ extensions: []
103
+ extra_rdoc_files: []
104
+ files:
105
+ - ".gitignore"
106
+ - ".ruby-version"
107
+ - Gemfile
108
+ - LICENSE.txt
109
+ - README.md
110
+ - Rakefile
111
+ - blf.gemspec
112
+ - example/example.rb
113
+ - lib/blf.rb
114
+ - lib/blf/block.rb
115
+ - lib/blf/test.rb
116
+ - lib/blf/version.rb
117
+ - lib/blf/world.rb
118
+ homepage: ''
119
+ licenses:
120
+ - MIT
121
+ metadata: {}
122
+ post_install_message:
123
+ rdoc_options: []
124
+ require_paths:
125
+ - lib
126
+ required_ruby_version: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
131
+ required_rubygems_version: !ruby/object:Gem::Requirement
132
+ requirements:
133
+ - - ">="
134
+ - !ruby/object:Gem::Version
135
+ version: '0'
136
+ requirements: []
137
+ rubyforge_project:
138
+ rubygems_version: 2.2.0
139
+ signing_key:
140
+ specification_version: 4
141
+ summary: This is an implementation of Bottom-Left method to 2-Dimensional Strip Packing
142
+ Problem.
143
+ test_files: []