waxy 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,28 @@
1
+ module Waxy
2
+ module Render
3
+ module Svg
4
+
5
+ # Concept from http://www-cs-students.stanford.edu/~amitp/game-programming/grids/draw_grid.rb
6
+ class Canvas
7
+
8
+ attr_accessor :width, :height
9
+ attr_accessor :body
10
+
11
+ def initialize(_width = 1000, _height = 1000)
12
+ @width = _width
13
+ @height = _height
14
+
15
+ @body = ''
16
+ end
17
+
18
+ def to_svg
19
+ doc = Waxy::Render::Svg.open_svg(self)
20
+ doc << body
21
+ doc << Waxy::Render::Svg.close_svg
22
+ doc
23
+ end
24
+
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,134 @@
1
+ module Waxy
2
+ module Render
3
+ module Svg
4
+
5
+ TEMPLATE_PATH = File.join(__dir__, 'templates').freeze
6
+
7
+ def self.open_svg(canvas)
8
+ t = Tilt.new(File.join(TEMPLATE_PATH, 'open_svg.erb'))
9
+ t.render(canvas)
10
+ end
11
+
12
+ def self.close_svg
13
+ t = Tilt.new(File.join(TEMPLATE_PATH, 'close_svg.erb'))
14
+ t.render
15
+ end
16
+
17
+ def self.hexagon(layout, hex, color = 'black')
18
+ t = Tilt.new(File.join(TEMPLATE_PATH, 'hex.erb'))
19
+ t.render(layout, hex: hex, color: color)
20
+ end
21
+
22
+ def self.hex_pie(layout, hex, meta = Waxy::Meta.new)
23
+ hex.size = meta.size
24
+ t = Tilt.new(File.join(TEMPLATE_PATH, 'hex_pie.erb'))
25
+ s = t.render(layout, hex: hex, meta: meta)
26
+ end
27
+
28
+ # A spiral layout that is continuous from an
29
+ # empty center.
30
+ # TODO: use a theta/spiral calc and pixel_to_hex
31
+ # to simplify(?) the algorithim
32
+ def self.spiral(layout, radius, metadata)
33
+ str = ''
34
+ hex = Waxy::Geometry::Hex.new( 0, 0, nil)
35
+ directions = [2, 3, 4, 5]
36
+
37
+ (0..radius).each do |r|
38
+ (0..r).each do |z|
39
+ hex = hex.hex_neighbor(0)
40
+ str << Waxy::Render::Svg.hex_pie(layout, hex, metadata.pop )
41
+ return str if metadata.size == 0
42
+ end
43
+
44
+ (0..r - 1).each do |o|
45
+ hex = hex.hex_neighbor(1)
46
+ str << Waxy::Render::Svg.hex_pie(layout, hex, metadata.pop )
47
+ return str if metadata.size == 0
48
+ end
49
+
50
+ directions.each do |v1|
51
+ (0..r).each do |y|
52
+ hex = hex.hex_neighbor(v1)
53
+ str << Waxy::Render::Svg.hex_pie(layout, hex, metadata.pop)
54
+ return str if metadata.size == 0
55
+ end
56
+ end
57
+ end
58
+ str
59
+ end
60
+
61
+ # Code directly from Amit/RedBlob games
62
+ # This is for known radius, if you don't
63
+ # have enough hexes it won't render a full hexagon,
64
+ # "painted" because it completes in bands
65
+ def self.painted_hexagon(layout, map_radius, metadata)
66
+ str = ''
67
+ ((-1 * map_radius)..(map_radius - 1)).each do |q|
68
+ r1 = [(-1 * map_radius), (-1 * q) - map_radius].max
69
+ r2 = [map_radius, (-1 * q) + map_radius].min
70
+
71
+ (r1 ... r2 - 1).each do |r|
72
+ hex = Waxy::Geometry::Hex.new( q, r, ((-1 * q) - r))
73
+ str << Waxy::Render::Svg.hex_pie(layout, hex, metadata.pop)
74
+
75
+ return str if metadata.size == 0
76
+ end
77
+ end
78
+ str
79
+ end
80
+
81
+ # Map for Square
82
+ def self.square(layout, metadata)
83
+ str = ''
84
+ h = Math.sqrt(metadata.size).to_i
85
+
86
+ (0..h).each do |r|
87
+ (0..h).each do |j|
88
+ return str if metadata.size == 0
89
+ q = j - (r/2).floor
90
+ hex = Waxy::Geometry::Hex.new(q, r)
91
+ str << Waxy::Render::Svg.hex_pie(layout, hex, metadata.pop)
92
+ end
93
+ end
94
+ str
95
+ end
96
+
97
+
98
+ def self.rectangle(layout, metadata, w = 10, h = 10)
99
+ str = ''
100
+
101
+ (0..h).each do |r|
102
+ layout.reset_w_padding
103
+ (0..w).each do |j|
104
+ return str if metadata.size == 0
105
+ q = j - (r/2).floor
106
+ hex = Waxy::Geometry::Hex.new(q, r)
107
+ str << Waxy::Render::Svg.hex_pie(layout, hex, metadata.pop)
108
+ layout.increase_w_padding
109
+ end
110
+ layout.increase_h_padding
111
+ end
112
+ str
113
+ end
114
+
115
+
116
+ # Interesting capped layout
117
+ # r = i
118
+ # q = j - [0, r - j].max
119
+
120
+ # Point top triangle
121
+ # r = i
122
+ # q = j - [0, j - r].max
123
+
124
+ # Upside down triangle
125
+ # r = i
126
+ # q = j - r - [0, (j - r)].max
127
+
128
+ # left pointing triangle
129
+ # r = i
130
+ # q = j - r - [0, (j - r)].max
131
+
132
+ end
133
+ end
134
+ end
@@ -0,0 +1,6 @@
1
+ <% meta ||= Waxy::Meta.new %>
2
+ <%= "<a href=\"#{meta.link}\" class=\"waxy__link\">" if meta.link %>
3
+ <g>
4
+ <polygon fill="<%= color %>" stroke="white" points="<%= polygon_corners(hex).collect{|p| [p.x, p.y].join(',') }.join(' ') %>"></polygon>"
5
+ </g>
6
+ <%= '</a>' if meta.link %>
@@ -0,0 +1,32 @@
1
+ <%= meta.hex_link_start %>
2
+ <g class="waxy__hexagon">
3
+ <%= meta.hex_link_title %>
4
+ <% c = polygon_corners(hex) %>
5
+
6
+ <% triangles(hex).each_with_index do |t, i| %>
7
+ <%= "<a href=\"#{meta.pie_links[i]}\" class=\"waxy__pie_link\">" if meta.pie_links[i] %>
8
+ <polygon class="waxy__triangle"
9
+ fill="<%= meta.colors[i] %>"
10
+ points="<%= t.collect{|p| [p.x + pad_w_offset, p.y + pad_h_offset].join(',') }.join(' ') %>" >
11
+ </polygon>
12
+ <%= "</a>" if meta.pie_links[i] %>
13
+ <% end %>
14
+
15
+ <g stroke="white" width="2">
16
+ <% (0..2).each do |i| %>
17
+ <line
18
+ x1="<%= c[i].x + pad_w_offset %>"
19
+ y1="<%= c[i].y + pad_h_offset %>"
20
+ x2="<%= c[i + 3].x + pad_w_offset %>"
21
+ y2="<%= c[i + 3].y + pad_h_offset %>"
22
+ />
23
+ <% end %>
24
+ </g>
25
+
26
+ <polygon stroke="<%= meta.stroke %>"
27
+ fill-opacity="0.0"
28
+ points="<%= c.collect{|p| [p.x + pad_w_offset, p.y + pad_h_offset].join(',') }.join(' ') %>">
29
+ </polygon>
30
+
31
+ </g>
32
+ <%= meta.hex_link_end %>
@@ -0,0 +1 @@
1
+ <svg id="image-fill" xmlns="http://www.w3.org/2000/svg" version="1.1" width="<%= width %>" height="<%= height %>" xmlns:xlink="http://www.w3.org/1999/xlink">
@@ -0,0 +1,59 @@
1
+
2
+ module Waxy
3
+ module Render
4
+ module Svg
5
+
6
+ end
7
+
8
+
9
+ # total = 100
10
+
11
+ # def point(center, size, i)
12
+ # angle_deg = 60.0 * i
13
+ # angle_rad = Math::PI / 180 * angle_deg
14
+ # return ((center.x + size) * Math.cos(angle_rad)), ((center.y + size ) * Math.sin(angle_rad))
15
+ # end
16
+
17
+ # def triangle(center, size, i)
18
+ # points = []
19
+ # points.push [0,0]
20
+ # points.push point(center, size, i)
21
+ # points.push point(center, size, (i + 1 == 7 ? 1 : i + 1))
22
+ # points
23
+ # end
24
+
25
+ # def hexagon(sizes)
26
+ # center = Center.new(SIZE, SIZE)
27
+ # triangles = []
28
+ # sizes.each_with_index do |s, i|
29
+ # next if s < 1.0
30
+ # triangles.push triangle(center, s, i.to_f)
31
+ # end
32
+
33
+ # triangles.each_with_index do |t, i|
34
+ # color = COLORS[i + 1]
35
+ # puts "<polygon fill=\"#{color}\" class=\"triangle\" points=\"#{t.collect{|p| p.join(',')}.join(' ')}\"></polygon>"
36
+ # puts "<line x1=\"0\" y1=\"0\" x2=\"#{t[1][0]}\" y2=\"#{t[1][1]}\" stroke=\"white\" width=\"2\" />"
37
+ # puts "<line x1=\"0\" y1=\"0\" x2=\"#{t[2][0]}\" y2=\"#{t[2][1]}\" stroke=\"white\" width=\"2\" />"
38
+ # end
39
+ # end
40
+
41
+ # puts '<svg id="image-fill" xmlns="http://www.w3.org/2000/svg" version="1.1" width="100%" height="1000" xmlns:xlink="http://www.w3.org/1999/xlink">'
42
+
43
+ # i = 0.0
44
+ # j = 0.0
45
+
46
+ # total.times.each do |z|
47
+ # sizes = (1..6).collect{|s| rand(0..SIZE) }
48
+
49
+ # puts "<g transform=\"translate(#{(i * 50.0) + 50.0} , #{(j * 50.0 + 50.0)})\">"
50
+ # hexagon(sizes)
51
+ # puts '</g>'
52
+ # i += 1
53
+ # if i > 9
54
+ # i = 0
55
+ # j = j + 1
56
+ # end
57
+ # end
58
+
59
+ # puts '</svg>'
@@ -0,0 +1,3 @@
1
+ module Waxy
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,46 @@
1
+
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require "waxy/version"
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "waxy"
8
+ spec.version = Waxy::VERSION
9
+ spec.authors = ["Matt Yoder"]
10
+ spec.email = ["diapriid@gmail.com"]
11
+
12
+ spec.summary = %q{Waxy is an experimental tool to generate hexagonal SVG visualizations using Ruby.}
13
+ spec.description = %q{Really, that's it.}
14
+ spec.homepage = "https://github.com/SpeciesFileGroup/waxy"
15
+ spec.license = "NCSA"
16
+
17
+ # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
18
+ # to allow pushing to a single host or delete this section to allow pushing to any host.
19
+ if spec.respond_to?(:metadata)
20
+ # spec.metadata["allowed_push_host"] = "TODO: Set to 'http://mygemserver.com'"
21
+
22
+ spec.metadata["homepage_uri"] = spec.homepage
23
+ spec.metadata["source_code_uri"] = "https://github.com/SpeciesFileGroup/waxy"
24
+ # spec.metadata["changelog_uri"] = "TODO: Put your gem's CHANGELOG.md URL here."
25
+ else
26
+ raise "RubyGems 2.0 or newer is required to protect against " \
27
+ "public gem pushes."
28
+ end
29
+
30
+ # Specify which files should be added to the gem when it is released.
31
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
32
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
33
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
34
+ end
35
+ spec.bindir = "exe"
36
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
37
+ spec.require_paths = ["lib"]
38
+
39
+ spec.add_dependency "tilt", "~> 2.0.9"
40
+
41
+ spec.add_development_dependency "byebug", "~> 11"
42
+ spec.add_development_dependency "awesome_print"
43
+ spec.add_development_dependency "bundler", "~> 2.0"
44
+ spec.add_development_dependency "rake", "~> 12.0"
45
+ spec.add_development_dependency "rspec", "~> 3.8"
46
+ end
metadata ADDED
@@ -0,0 +1,163 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: waxy
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Matt Yoder
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2019-04-04 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: tilt
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 2.0.9
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.9
27
+ - !ruby/object:Gem::Dependency
28
+ name: byebug
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '11'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '11'
41
+ - !ruby/object:Gem::Dependency
42
+ name: awesome_print
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: bundler
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '2.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '2.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '12.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '12.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '3.8'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '3.8'
97
+ description: Really, that's it.
98
+ email:
99
+ - diapriid@gmail.com
100
+ executables: []
101
+ extensions: []
102
+ extra_rdoc_files: []
103
+ files:
104
+ - ".gitignore"
105
+ - ".rspec"
106
+ - ".travis.yml"
107
+ - CHANGELOG.md
108
+ - CODE_OF_CONDUCT.md
109
+ - Gemfile
110
+ - Gemfile.lock
111
+ - LICENSE.txt
112
+ - README.md
113
+ - Rakefile
114
+ - bin/console
115
+ - bin/setup
116
+ - examples/img/random.png
117
+ - examples/img/rectangle.png
118
+ - lib/waxy.rb
119
+ - lib/waxy/geometry.rb
120
+ - lib/waxy/geometry/fractional_hex.rb
121
+ - lib/waxy/geometry/hex.rb
122
+ - lib/waxy/geometry/layout.rb
123
+ - lib/waxy/geometry/orientation.rb
124
+ - lib/waxy/geometry/point.rb
125
+ - lib/waxy/meta.rb
126
+ - lib/waxy/render.rb
127
+ - lib/waxy/render/canvas.rb
128
+ - lib/waxy/render/svg.rb
129
+ - lib/waxy/render/templates/close_svg.erb
130
+ - lib/waxy/render/templates/hex.erb
131
+ - lib/waxy/render/templates/hex_pie.erb
132
+ - lib/waxy/render/templates/open_svg.erb
133
+ - lib/waxy/render/templates/svg.erb
134
+ - lib/waxy/version.rb
135
+ - waxy.gemspec
136
+ homepage: https://github.com/SpeciesFileGroup/waxy
137
+ licenses:
138
+ - NCSA
139
+ metadata:
140
+ homepage_uri: https://github.com/SpeciesFileGroup/waxy
141
+ source_code_uri: https://github.com/SpeciesFileGroup/waxy
142
+ post_install_message:
143
+ rdoc_options: []
144
+ require_paths:
145
+ - lib
146
+ required_ruby_version: !ruby/object:Gem::Requirement
147
+ requirements:
148
+ - - ">="
149
+ - !ruby/object:Gem::Version
150
+ version: '0'
151
+ required_rubygems_version: !ruby/object:Gem::Requirement
152
+ requirements:
153
+ - - ">="
154
+ - !ruby/object:Gem::Version
155
+ version: '0'
156
+ requirements: []
157
+ rubyforge_project:
158
+ rubygems_version: 2.7.8
159
+ signing_key:
160
+ specification_version: 4
161
+ summary: Waxy is an experimental tool to generate hexagonal SVG visualizations using
162
+ Ruby.
163
+ test_files: []