rhex 1.2.3 → 2.0.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5a2e40d08cd8b0af78d794a06edabe792d504d1d
4
- data.tar.gz: 5f4c074aa457e00505c5c5bad0a2721d55a27180
3
+ metadata.gz: 8ddd109e085e6fd0019a06bcddeef878e5132045
4
+ data.tar.gz: 1693182acc5400722ae6598934f71d7dd85acf89
5
5
  SHA512:
6
- metadata.gz: a2bf038530231da4e29dc9626062a0d2935b522de5b84bb60aa39aa5faffd0f65888571fd3c125fe20d97e850424e81c503eb25ac98c4b9943e298b43345c82b
7
- data.tar.gz: 131308282edb5a1a3bb3b6e408884eb1a18c04e3f8b73b6d952014cf879e526e59b74ccbf2566a3e87bcef493db57cf1936093c48ebc0f4e444a2f79e656692e
6
+ metadata.gz: 6db25e6a50b842d46d001f3c479c2e800f96dc0d96d66fd68e51297f6d2d8efdc52cc3c1f4abc34dc95ff1c10df3436be662b5e852a997d9c277ba18baf1411c
7
+ data.tar.gz: 0b40396657b73c09556af4923f6862a2df2b41bbce686c945ae9ab352780d4793c5b0a60a12a1401f457c72420947065b884ed52286bc2289fdf6d73ad2df25d
@@ -0,0 +1,109 @@
1
+ require_relative 'axial_hex'
2
+ require_relative 'modules/ascii_to_grid'
3
+ require_relative 'modules/grid_to_pic'
4
+
5
+ # This class represents a grid of hexagons stored in an axial coordinate system.
6
+ #
7
+ # Please read http://www.redblobgames.com/grids/hexagons/#coordinates to understand what an axial coordinates system is.
8
+ class AxialGrid
9
+
10
+ include GridToPic
11
+ include AsciiToGrid
12
+
13
+ # Create an hexagon object
14
+ # - +hex_ray+ is the size of an hexagon. Please read : http://www.redblobgames.com/grids/hexagons/#basics for information about the size of an hexagon.
15
+ # - +element_to_color_hash+ : is a hash that relate color (see BaseHex::Axial.new) to a color. This is used to dump your grid to a bitmap field.
16
+ #
17
+ # Example
18
+ #
19
+ # @g = Hex::Grid.new(
20
+ # element_to_color_hash: {
21
+ # m: :brown, g: :green, w: :blue
22
+ # }
23
+ # )
24
+ #
25
+ # Assuming you want all hex with a colorue of m are drawn in brown,g in green, etc ... (see GridToPic for drawin a grid)
26
+ #
27
+ # *Returns* : a new Hex::Grid object.
28
+ def initialize( hex_ray: 16, element_to_color_hash: {} )
29
+ @hexes={}
30
+ @element_to_color_hash = element_to_color_hash
31
+ @hex_ray = hex_ray
32
+ set_hex_dimensions
33
+ end
34
+
35
+ # Set the hex colorue to color conversion hash
36
+ #
37
+ # *Returns* : nothing.
38
+ def set_element_to_color_hash( element_to_color_hash )
39
+ @element_to_color_hash = element_to_color_hash
40
+ end
41
+
42
+ # Create an hexagon at a given position (q, r)
43
+ #
44
+ # You can set a color for the hexagon and set the hex as a border hex or not
45
+ #
46
+ # *Returns* : an Hex::Axial object.
47
+ def cset( q, r, color: nil, border: false, data: nil )
48
+ @hexes[ [ q, r ] ] = AxialHex.new( q, r, color: color, border: border, data: data )
49
+ end
50
+
51
+ # Same method, but accept an hexagon instead of (q, r) coords
52
+ #
53
+ # *Returns* : the created Hex::Axial object.
54
+ def hset( hex )
55
+ @hexes[ [ hex.q, hex.r ] ] = hex
56
+ end
57
+
58
+ # Get the hexagon at a given position (q, r)
59
+ #
60
+ # *Returns* : the created Hex::Axial object.
61
+ def cget( q, r )
62
+ @hexes[ [ q, r ] ]
63
+ end
64
+
65
+ # Same method, but accept an hexagon instead of (q, r) coords
66
+ #
67
+ # *Returns* : the created Hex::Axial object.
68
+ def hget( hex )
69
+ @hexes[ [ hex.q, hex.r ] ]
70
+ end
71
+
72
+ # Call the block for each Hex in the grid
73
+ #
74
+ # *Returns* : nothing
75
+ def each
76
+ @hexes.sort.each{ |h| yield h[1] }
77
+ end
78
+
79
+ # Return all surrounding hexes from grid
80
+ #
81
+ # *Returns* : Array of AxialHex
82
+ def h_surrounding_hexes( h )
83
+ h.surrounding_hexes.map{ |sh| hget( sh ) }
84
+ end
85
+
86
+ # Get the hexagon at (x,y) coordinate.
87
+ #
88
+ # *Returns* : the Hex::Axial object at x, y pos.
89
+ def hex_at_xy(x, y)
90
+ q = (x * Math.sqrt(3)/3.0 - y/3.0) / @hex_ray
91
+ r = y * 2.0/3.0 / @hex_ray
92
+ hex = AxialHex.new(q, r).round
93
+ cget( hex.q, hex.r )
94
+ end
95
+ #
96
+ # Give the position of an hexagon object in pixel.
97
+ #
98
+ # *Returns* : an array of x, y positions.
99
+ def to_xy( hex )
100
+
101
+ set_hex_dimensions
102
+
103
+ tmp_q = hex.q
104
+ x = ( @hex_ray * Math.sqrt(3) * ( tmp_q + hex.r/2.0 ) )
105
+ y = ( @hex_ray * 3.0/2.0 * hex.r )
106
+ [ x, y ]
107
+ end
108
+
109
+ end
@@ -0,0 +1,122 @@
1
+ # -*- encoding : utf-8 -*-
2
+
3
+ require_relative 'cube_hex'
4
+
5
+ # This class represents an hexagon stored in axial coordinate system.
6
+ #
7
+ # Please read http://www.redblobgames.com/grids/hexagons/#coordinates
8
+ # to understand what an axial coordinates system is
9
+ class AxialHex < BaseHex
10
+
11
+ attr_reader :q, :r #:nodoc:
12
+
13
+ # Directions around hex from top left clockwise
14
+ DIRECTIONS = [ [0,-1], [1,-1], [1,0], [0,1], [-1,+1], [-1,0] ] #:nodoc:
15
+
16
+ # Create an hexagon object
17
+ # - +q+ and +r+ are the coordinates in the axial coords system
18
+ # - +color+ : is a colorue anything you want.
19
+ # - +border+ is a boolean and mean that the hex is at the border of the map.
20
+ #
21
+ # *Returns* : a new Hex::Axial object.
22
+ def initialize( q, r, color: nil, border: false, data: nil )
23
+ @q = q
24
+ @r = r
25
+ super( color, border, data )
26
+ end
27
+
28
+ # Check the equality between two hexagons.
29
+ def ==(h) #:nodoc:
30
+ @q==h.q && @r==h.r
31
+ end
32
+
33
+ def !=(h) #:nodoc:
34
+ @q!=h.q || @r!=h.r
35
+ end
36
+
37
+ # Transform an axial represented hexagon object to a cube represented hexagon object.
38
+ #
39
+ # *Returns* : a new Hex::Cube object.
40
+ def to_cube
41
+ CubeHex.new(@q, -@q-@r, @r)
42
+ end
43
+
44
+ # From an array of hexagons, get the nearest
45
+ # - +hex_array+ : and array of Hex::Axial objects
46
+ #
47
+ # Example
48
+ #
49
+ # hext_to_test = Hex::Axial.new( 5, 5 )
50
+ # nearest_hex = Hex::Axial.new( 5, 6 )
51
+ # far_hex = Hex::Axial.new( 20, 20 )
52
+ #
53
+ # nearest_hex.nearset_hex( [ hext_to_test, far_hex ] ) #=> #<Hex::Axial @q=5, @r=6>
54
+ #
55
+ # *Returns* : the nearset hex as a Hex::Axial object.
56
+ def nearest_hex( hex_array )
57
+ nearest_hex = nil
58
+ current_distance = nil
59
+ hex_array.each do |h|
60
+ if nearest_hex
61
+ dist = distance( h )
62
+ if distance( h ) < current_distance
63
+ nearest_hex = h
64
+ current_distance = dist
65
+ end
66
+ else
67
+ nearest_hex = h
68
+ current_distance = distance( h )
69
+ end
70
+ end
71
+ nearest_hex
72
+ end
73
+
74
+ ##
75
+ # Compute the distance (in hex) between two hexagons
76
+ # - +h+ : an Hex::Axial object
77
+ #
78
+ # Example
79
+ #
80
+ # h1 = Hex::Axial.new( 5, 5 )
81
+ # h2 = Hex::Axial.new( 20, 20 )
82
+ #
83
+ # h1.distance( h2 ) #=> 30
84
+ #
85
+ # Hex::Axial.new( 5, 5 ).distance( Hex::Axial.new( 5, 5 ) ) #=> 0
86
+ # Hex::Axial.new( 5, 5 ).distance( Hex::Axial.new( 5, 1 ) ) #=> 1
87
+ #
88
+ # *Returns* : the distance between the two hexes as an integer.
89
+ def distance( h )
90
+ to_cube.distance(h.to_cube)
91
+ end
92
+
93
+ # Get all hexagons surrounding the current hexagon
94
+ #
95
+ # *Returns* : an array of Hex::Axial.
96
+ def surrounding_hexes
97
+ # puts self.inspect, self.q.inspect, self.r.inspect
98
+ DIRECTIONS.map{ |e| AxialHex.new( @q+e[0], @r+e[1] ) }
99
+ end
100
+
101
+ # Check if an hexagon is around another hexagon
102
+ #
103
+ # *Returns* : true if the hexagon is adjacent to the other, false otherwise. Note, h.hex_surrounding_hex?( h ) == false
104
+ def hex_surrounding_hex?(hex)
105
+ distance(hex)==1
106
+ end
107
+
108
+ # Round an hexagon coordinates (useful after pixel to axial coordinate transformation)
109
+ #
110
+ # *Returns* : an Hex::Axial with coords rounded.
111
+ def round
112
+ to_cube.round.to_axial
113
+ end
114
+
115
+ # Transform an hex to it's q, r coordinates
116
+ #
117
+ # *Returns* : an array [ q, r ]
118
+ def qr
119
+ [ q, r ]
120
+ end
121
+
122
+ end
@@ -0,0 +1,9 @@
1
+ class BaseHex
2
+ attr_accessor :color, :border, :data #:nodoc:
3
+
4
+ def initialize( color = nil, border = nil, data = nil )
5
+ @color = color if color
6
+ @border = @border if border
7
+ @data = data
8
+ end
9
+ end
@@ -0,0 +1,61 @@
1
+ require_relative 'base_hex'
2
+
3
+ # This class represents an hexagon stored in a cube coordinate system.
4
+ #
5
+ # Please read http://www.redblobgames.com/grids/hexagons/#coordinates
6
+ # to understand what a cube coordinates system is
7
+ # The cube class is only for computation.
8
+ # It is not intended to be used directly in your program.
9
+ class CubeHex < BaseHex
10
+
11
+ attr_reader :x,:y,:z #:nodoc:
12
+
13
+ # Create an hexagon object
14
+ # - +x+, +y+, +z+ are the coordinates in the axial coords system
15
+ #
16
+ # *Returns* : a new Hex::Cube object.
17
+ def initialize( x, y, z, color: nil, border: nil, data: nil )
18
+ @x = x
19
+ @y = y
20
+ @z = z
21
+
22
+ super( color, border, data )
23
+ end
24
+
25
+ # Transform a cube represented hexagon to an Hexagon::Axial represented hexagon
26
+ #
27
+ # *Returns* : a new Hex::Axial object.
28
+ def to_axial
29
+ AxialHex.new(@x, @z, color: @color, border: @border, data: @data)
30
+ end
31
+
32
+ # Round the float coordinates to integer coordinates.
33
+ #
34
+ # *Returns* : a new Hex::Cube object.
35
+ def round
36
+ rx=@x.round(0)
37
+ ry=@y.round(0)
38
+ rz=@z.round(0)
39
+
40
+ x_diff=(rx-@x).abs
41
+ y_diff=(ry-@y).abs
42
+ z_diff=(rz-@z).abs
43
+
44
+ if x_diff > y_diff and x_diff > z_diff
45
+ rx = -ry-rz
46
+ elsif y_diff > z_diff
47
+ ry = -rx-rz
48
+ else
49
+ rz = -rx-ry
50
+ end
51
+ CubeHex.new(rx, ry, rz, color: @color, border: @border, data: @data)
52
+ end
53
+
54
+ # Compute the distance between two hexagons (in hexagons)
55
+ #
56
+ # *Returns* : an integer : the distance between hex in hexagons.
57
+ def distance(h)
58
+ [(@x - h.x).abs, (@y - h.y).abs, (@z - h.z).abs].max
59
+ end
60
+
61
+ end
@@ -14,7 +14,7 @@ module AsciiToGrid
14
14
  elements.each do |element|
15
15
  border = true if ( r == 0 || q == 0 )
16
16
  shifted_q = q - ( r/2 )
17
- cset( shifted_q, r, val: element, border: border )
17
+ cset( shifted_q, r, color: element, border: border )
18
18
  q += 1
19
19
  end
20
20
  r += 1
@@ -24,11 +24,12 @@ module AsciiToGrid
24
24
  0.upto( max_r - 1 ).each do |row|
25
25
  maxq = @hexes.map{ |key, e| e.q if e.r == row }.compact.max
26
26
  hex = cget( maxq, row )
27
- hex.border! if hex
27
+ hex.border = true if hex
28
28
  end
29
29
 
30
- @hexes.each{ |key, e| e.border! if e.r == ( max_r - 1 ) }
30
+ @hexes.each{ |key, e| e.border = true if e.r == ( max_r - 1 ) }
31
31
 
32
32
  end
33
33
  end
34
+
34
35
  end
@@ -12,29 +12,45 @@ end
12
12
  module GridToPic
13
13
 
14
14
  attr_reader :hex_height, :hex_width #:nodoc:
15
+ attr_reader :quarter_height, :half_width #:nodoc:
15
16
 
16
- # Draw a picture of the hexagon grid
17
- # - +pic_name+ : the name of the picture file (can be *.bmp, *.png, *.jpg)
17
+ # Draw the hex grid in a Magick::Image object
18
18
  # - +exit_on_error+ : by default, if you call this method and rmagic is not installed, the program exit with an error. You can disable it and make the program continue.
19
19
  #
20
- # *Returns* : true if the file was created successfully, false otherwise.
21
- def to_pic( pic_name, exit_on_error = true )
20
+ # *Returns* : the Magick::Image object
21
+ def to_rmagick_image( exit_on_error = true )
22
22
  unless defined?( Magick::Image ) && defined?( Magick::HatchFill ) && defined?( Magick::Draw )
23
23
  puts 'Rmagick is not installed !!! You can\'t dump hex grid to pic'
24
24
  exit if exit_on_error
25
25
  end
26
26
 
27
- maxx = @hexes.keys.map{ |k| k[0] }.max * @hex_width
28
- maxy = @hexes.keys.map{ |k| k[1] }.max * @hex_height * 3.0/4.0
27
+ maxx = ( @hexes.keys.map{ |k| k[0] + k[1]/2 }.max ) * @hex_width - ( @hex_width / 2 ) + 1
28
+ maxy = @hexes.keys.map{ |k| k[1] }.max * ( ( @hex_height * 3.0 )/ 4.0 ).ceil - ( @hex_width / 4 ).ceil - 2
29
+
30
+ # maxx = ( ( @hexes.keys.map{ |k| k[0] + k[1]/2 }.max ) + 0.5 ) * @hex_width
31
+ # maxy = ( ( @hexes.keys.map{ |k| k[1] }.max * 3.0/4.0 ) + 0.5 ) + @hex_heig
29
32
 
30
33
  canvas = Magick::Image.new( maxx, maxy )
34
+
31
35
  gc = Magick::Draw.new
32
36
  gc.stroke_antialias( true )
33
37
  gc.stroke( 'black' )
38
+ gc.stroke_opacity( '60%' )
34
39
 
35
40
  @hexes.each{ | _, hex| draw_hex( gc, hex ) }
36
41
 
37
42
  gc.draw(canvas)
43
+
44
+ canvas
45
+ end
46
+
47
+ # Draw the hex grid on a Magick::Object and save it to a file
48
+ # - +pic_name+ : the name of the picture file (can be *.bmp, *.png, *.jpg)
49
+ # - +exit_on_error+ : by default, if you call this method and rmagic is not installed, the program exit with an error. You can disable it and make the program continue.
50
+ #
51
+ # *Returns* : true if the file was created successfully, false otherwise.
52
+ def to_pic( pic_name, exit_on_error = true )
53
+ canvas = to_rmagick_image( exit_on_error )
38
54
  canvas.write( pic_name )
39
55
  end
40
56
 
@@ -51,13 +67,16 @@ module GridToPic
51
67
  end
52
68
 
53
69
  def get_color( hex )
54
- color = @element_to_color_hash[ hex.val ]
70
+ color = @element_to_color_hash[ hex.color ]
55
71
  color ? color : :white
56
72
  end
57
73
 
58
74
  def draw_hex( gc, hex )
59
75
  x, y = to_xy( hex )
60
76
 
77
+ x -= @hex_width
78
+ y -= @quarter_height * 2
79
+
61
80
  color = get_color( hex )
62
81
  gc.fill( color.to_s )
63
82
 
@@ -0,0 +1,27 @@
1
+ require_relative 'axial_grid'
2
+ require_relative 'cube_hex'
3
+
4
+ class SquareGrid < AxialGrid
5
+
6
+ def cset( col, row, color: nil, border: false, data: nil )
7
+ hset( even_q_to_axial_hex( col, row, color: color, border: border, data: data ) )
8
+ end
9
+
10
+ def cget( col, row )
11
+ hget( even_q_to_axial_hex( col, row ) )
12
+ end
13
+
14
+ private
15
+
16
+ def even_q_to_axial_hex( col, row, color: nil, border: false, data: nil )
17
+ # convert odd-r offset to cube
18
+ x = col - (row - (row&1)) / 2
19
+ z = row
20
+ y = -x-z
21
+
22
+ tmp_cube = CubeHex.new( x, y, z, color: color, border: border, data: data )
23
+
24
+ tmp_cube.to_axial
25
+ end
26
+
27
+ end
@@ -1,3 +1,4 @@
1
- require_relative 'hex/axial'
2
- require_relative 'hex/cube'
3
- require_relative 'hex/grid'
1
+ require_relative 'hex/axial_hex'
2
+ require_relative 'hex/cube_hex'
3
+ require_relative 'hex/axial_grid'
4
+ require_relative 'hex/square_grid'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rhex
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.3
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cédric ZUGER
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-01-04 00:00:00.000000000 Z
11
+ date: 2016-01-05 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: |2
14
14
  A library providing hexagons management and hexagonal grids for ruby.
@@ -19,11 +19,13 @@ executables: []
19
19
  extensions: []
20
20
  extra_rdoc_files: []
21
21
  files:
22
- - lib/hex/ascii_to_grid.rb
23
- - lib/hex/axial.rb
24
- - lib/hex/cube.rb
25
- - lib/hex/grid.rb
26
- - lib/hex/grid_to_pic.rb
22
+ - lib/hex/axial_grid.rb
23
+ - lib/hex/axial_hex.rb
24
+ - lib/hex/base_hex.rb
25
+ - lib/hex/cube_hex.rb
26
+ - lib/hex/modules/ascii_to_grid.rb
27
+ - lib/hex/modules/grid_to_pic.rb
28
+ - lib/hex/square_grid.rb
27
29
  - lib/rhex.rb
28
30
  homepage: https://github.com/czuger/rhex
29
31
  licenses:
@@ -35,17 +37,17 @@ require_paths:
35
37
  - lib
36
38
  required_ruby_version: !ruby/object:Gem::Requirement
37
39
  requirements:
38
- - - ">="
40
+ - - '>='
39
41
  - !ruby/object:Gem::Version
40
42
  version: 2.0.0
41
43
  required_rubygems_version: !ruby/object:Gem::Requirement
42
44
  requirements:
43
- - - ">="
45
+ - - '>='
44
46
  - !ruby/object:Gem::Version
45
47
  version: '0'
46
48
  requirements: []
47
49
  rubyforge_project:
48
- rubygems_version: 2.4.1
50
+ rubygems_version: 2.4.8
49
51
  signing_key:
50
52
  specification_version: 4
51
53
  summary: Ruby HEXagonal grid
@@ -1,129 +0,0 @@
1
- # -*- encoding : utf-8 -*-
2
-
3
- require_relative 'cube'
4
-
5
- # This module contains is the container for all hexagon classes.
6
- module Hex
7
-
8
- # This class represents an hexagon stored in axial coordinate system.
9
- #
10
- # Please read http://www.redblobgames.com/grids/hexagons/#coordinates
11
- # to understand what an axial coordinates system is
12
- class Axial
13
-
14
- attr_reader :q, :r, :val #:nodoc:
15
-
16
- # Directions around hex from top left clockwise
17
- DIRECTIONS = [ [0,-1], [1,-1], [1,0], [0,1], [-1,+1], [-1,0] ] #:nodoc:
18
-
19
- # Create an hexagon object
20
- # - +q+ and +r+ are the coordinates in the axial coords system
21
- # - +val+ : is a value anything you want.
22
- # - +border+ is a boolean and mean that the hex is at the border of the map.
23
- #
24
- # *Returns* : a new Hex::Axial object.
25
- def initialize( q, r, val: nil, border: false )
26
- @q = q
27
- @r = r
28
- @val = val.to_sym if val
29
- @border = border
30
- end
31
-
32
- # Check the equality between two hexagons.
33
- def ==(h) #:nodoc:
34
- @q==h.q && @r==h.r
35
- end
36
-
37
- # Force the border status of the hex.
38
- #
39
- # *Returns* : true.
40
- def border!
41
- @border = true
42
- end
43
-
44
- # Get the border status of the hex.
45
- #
46
- # *Returns* : true if the hex is at the border of the grid, false otherwise (only if border have been set. Return false otherwise).
47
- def border?
48
- !@border.nil?
49
- end
50
-
51
- # Transform an axial represented hexagon object to a cube represented hexagon object.
52
- #
53
- # *Returns* : a new Hex::Cube object.
54
- def to_cube
55
- Hex::Cube.new(@q,-@q-@r,@r)
56
- end
57
-
58
- # From an array of hexagons, get the nearest
59
- # - +hex_array+ : and array of Hex::Axial objects
60
- #
61
- # Example
62
- #
63
- # hext_to_test = Hex::Axial.new( 5, 5 )
64
- # nearest_hex = Hex::Axial.new( 5, 6 )
65
- # far_hex = Hex::Axial.new( 20, 20 )
66
- #
67
- # nearest_hex.nearset_hex( [ hext_to_test, far_hex ] ) #=> #<Hex::Axial @q=5, @r=6>
68
- #
69
- # *Returns* : the nearset hex as a Hex::Axial object.
70
- def nearest_hex( hex_array )
71
- nearest_hex = nil
72
- current_distance = nil
73
- hex_array.each do |h|
74
- unless nearest_hex
75
- nearest_hex = h
76
- current_distance = distance( h )
77
- else
78
- nearest_hex = h if distance( h ) < current_distance
79
- end
80
- end
81
- nearest_hex
82
- end
83
-
84
- ##
85
- # Compute the distance (in hex) between two hexagons
86
- # - +h+ : an Hex::Axial object
87
- #
88
- # Example
89
- #
90
- # h1 = Hex::Axial.new( 5, 5 )
91
- # h2 = Hex::Axial.new( 20, 20 )
92
- #
93
- # h1.distance( h2 ) #=> 30
94
- #
95
- # Hex::Axial.new( 5, 5 ).distance( Hex::Axial.new( 5, 5 ) ) #=> 0
96
- # Hex::Axial.new( 5, 5 ).distance( Hex::Axial.new( 5, 1 ) ) #=> 1
97
- #
98
- # *Returns* : the distance between the two hexes as an integer.
99
- def distance( h )
100
- to_cube.distance(h.to_cube)
101
- end
102
-
103
- # Get all hexagons surrounding the current hexagon
104
- #
105
- # *Returns* : an array of Hex::Axial.
106
- def get_surrounding_hexs
107
- # puts self.inspect, self.q.inspect, self.r.inspect
108
- DIRECTIONS.map{ |e| Hex::Axial.new( @q+e[0], @r+e[1] ) }
109
- end
110
-
111
- # Check if an hexagon is around another hexagon
112
- #
113
- # *Returns* : true if the hexagon is adjacent to the other, false otherwise. Note, h.hex_surrounding_hex?( h ) == false
114
- def hex_surrounding_hex?(hex)
115
- distance(hex)==1
116
- end
117
-
118
- # Round an hexagon coordinates (useful after pixel to axial coordinate transformation)
119
- #
120
- # *Returns* : an Hex::Axial with coords rounded.
121
- def round
122
- to_cube.round.to_axial
123
- end
124
-
125
- end
126
- end
127
-
128
-
129
-
@@ -1,60 +0,0 @@
1
- module Hex
2
-
3
- # This class represents an hexagon stored in a cube coordinate system.
4
- #
5
- # Please read http://www.redblobgames.com/grids/hexagons/#coordinates
6
- # to understand what a cube coordinates system is
7
- # The cube class is only for computation.
8
- # It is not intended to be used directly in your program.
9
- class Cube
10
-
11
- attr_reader :x,:y,:z #:nodoc:
12
-
13
- # Create an hexagon object
14
- # - +x+, +y+, +z+ are the coordinates in the axial coords system
15
- #
16
- # *Returns* : a new Hex::Cube object.
17
- def initialize(x,y,z)
18
- @x = x
19
- @y = y
20
- @z = z
21
- end
22
-
23
- # Transform a cube represented hexagon to an Hexagon::Axial represented hexagon
24
- #
25
- # *Returns* : a new Hex::Axial object.
26
- def to_axial
27
- Hex::Axial.new(@x,@z)
28
- end
29
-
30
- # Round the float coordinates to integer coordinates.
31
- #
32
- # *Returns* : a new Hex::Cube object.
33
- def round
34
- rx=@x.round(0)
35
- ry=@y.round(0)
36
- rz=@z.round(0)
37
-
38
- x_diff=(rx-@x).abs
39
- y_diff=(ry-@y).abs
40
- z_diff=(rz-@z).abs
41
-
42
- if x_diff > y_diff and x_diff > z_diff
43
- rx = -ry-rz
44
- elsif y_diff > z_diff
45
- ry = -rx-rz
46
- else
47
- rz = -rx-ry
48
- end
49
- Hex::Cube.new(rx,ry,rz)
50
- end
51
-
52
- # Compute the distance between two hexagons (in hexagons)
53
- #
54
- # *Returns* : an integer : the distance between hex in hexagons.
55
- def distance(h)
56
- [(@x - h.x).abs, (@y - h.y).abs, (@z - h.z).abs].max
57
- end
58
-
59
- end
60
- end
@@ -1,88 +0,0 @@
1
- require_relative 'axial'
2
- require_relative 'grid_to_pic'
3
- require_relative 'ascii_to_grid'
4
-
5
- module Hex
6
-
7
- # This class represents a grid of hexagons stored in an axial coordinate system.
8
- #
9
- # Please read http://www.redblobgames.com/grids/hexagons/#coordinates to understand what an axial coordinates system is.
10
- class Grid
11
-
12
- include GridToPic
13
- include AsciiToGrid
14
-
15
- # Create an hexagon object
16
- # - +hex_ray+ is the size of an hexagon. Please read : http://www.redblobgames.com/grids/hexagons/#basics for information about the size of an hexagon.
17
- # - +element_to_color_hash+ : is a hash that relate val (see Hex::Axial.new) to a color. This is used to dump your grid to a bitmap field.
18
- #
19
- # Example
20
- #
21
- # @g = Hex::Grid.new(
22
- # element_to_color_hash: {
23
- # m: :brown, g: :green, w: :blue
24
- # }
25
- # )
26
- #
27
- # Assuming you want all hex with a value of m are drawn in brown,g in green, etc ... (see GridToPic for drawin a grid)
28
- #
29
- # *Returns* : a new Hex::Grid object.
30
- def initialize( hex_ray: 16, element_to_color_hash: {} )
31
- @hexes={}
32
- @element_to_color_hash = element_to_color_hash
33
- @hex_ray = hex_ray
34
- set_hex_dimensions
35
- end
36
-
37
- # Create an hexagon at a given position (q, r)
38
- #
39
- # You can set a value for the hexagon and set the hex as a border hex or not
40
- #
41
- # *Returns* : an Hex::Axial object.
42
- def cset( q, r, val: nil, border: false )
43
- @hexes[ [ q, r ] ] = Hex::Axial.new( q, r, val: val, border: border )
44
- end
45
-
46
- # Same method, but accept an hexagon instead of (q, r) coords
47
- #
48
- # *Returns* : the created Hex::Axial object.
49
- def hset( hex, val: nil, border: false )
50
- @hexes[ [ hex.q, hex.r ] ] = Hex::Axial.new( hex.q, hex.r, val: val, border: border )
51
- end
52
-
53
- # Get the hexagon at a given position (q, r)
54
- #
55
- # *Returns* : the created Hex::Axial object.
56
- def cget( q, r )
57
- @hexes[ [ q, r ] ]
58
- end
59
-
60
- # Same method, but accept an hexagon instead of (q, r) coords
61
- #
62
- # *Returns* : the created Hex::Axial object.
63
- def hget( hex )
64
- @hexes[ [ hex.q, hex.r ] ]
65
- end
66
-
67
- # Get the hexagon at (x,y) coordinate.
68
- #
69
- # *Returns* : the Hex::Axial object at x, y pos.
70
- def hex_at_xy(x, y)
71
- q = (x * Math.sqrt(3)/3.0 - y/3.0) / @hex_ray
72
- r = y * 2.0/3.0 / @hex_ray
73
- hex = Hex::Axial.new(q, r).round
74
- cget( hex.q, hex.r )
75
- end
76
-
77
- # Give the position of an hexagon object in pixel.
78
- #
79
- # *Returns* : an array of x, y positions.
80
- def to_xy( hex )
81
- tmp_q = hex.q
82
- x = @hex_ray * Math.sqrt(3) * ( tmp_q + hex.r/2.0 )
83
- y = @hex_ray * 3.0/2.0 * hex.r
84
- [ x, y ]
85
- end
86
-
87
- end
88
- end