rhex 1.2.1 → 1.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6ba2d22ee5ac0982fc31d05f3a485b378f8503a2
4
- data.tar.gz: 24917573a42bfff6c51db21390c212767c2b49be
3
+ metadata.gz: 4495c4b3d933607b7ea7e0b10bc42a122ff74c0c
4
+ data.tar.gz: ddd8919e2e5507048aba10dcd760f5bc89e862a0
5
5
  SHA512:
6
- metadata.gz: b7da992847c675e39b7ecff68c0730994b679f8247b0c84662e9461a7ee7c498c0f5b8ef2d1d01c567f8f1ea6a313405a75e986ecff03296a235db71f2c0e3c0
7
- data.tar.gz: 2e3b30f040101b88da3774cf6d543374e49c9dfc84133d311777f9820a090b795173152c7d38bfc7b980100f2859e59cbe07b4698d87fa33643fd51e374f7441
6
+ metadata.gz: de3022c9dc1cb096435ec471bc0adf61769abe5d2a4fae5f86d787e172f5b8e9ec70896543b38e4d31a559d2eea673d7b2189fa4be662ada04d4b1d102daddfe
7
+ data.tar.gz: c37e4bff873ef76137a4ee0d31164598af1c1ae2d50d53cc89e6f5c7f0828b31bd8ca305f234610615b0a7232324cecdb48d9f64bc12c1743fa9215aff324362
@@ -1,5 +1,8 @@
1
+ # This module contains the methods relatives to ascii map reading
1
2
  module AsciiToGrid
2
3
 
4
+ # Read an ascii file and load it into the hexagon grid.
5
+ # - +file_path+ : is the name of the ascii file to read. For how to create this file, please see : https://github.com/czuger/rhex#reading-a-grid-from-an-ascii-file
3
6
  def read_ascii_file( file_path )
4
7
  File.open( file_path ) do |file|
5
8
 
data/lib/hex/axial.rb CHANGED
@@ -2,15 +2,26 @@
2
2
 
3
3
  require_relative 'cube'
4
4
 
5
+ # This module contains is the container for all hexagon classes.
5
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
6
12
  class Axial
7
13
 
8
- attr_reader :q, :r, :val
14
+ attr_reader :q, :r, :val #:nodoc:
9
15
 
10
16
  # Directions around hex from top left clockwise
11
- DIRECTIONS = [ [0,-1], [1,-1], [1,0], [0,1], [-1,+1], [-1,0] ]
12
-
13
- # Create a new pointy topped axial represented hexagon object
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.
14
25
  def initialize( q, r, val: nil, border: false )
15
26
  @q = q
16
27
  @r = r
@@ -18,27 +29,44 @@ module Hex
18
29
  @border = border
19
30
  end
20
31
 
21
- # Equality between two hexagons
22
- def ==(h)
32
+ # Check the equality between two hexagons.
33
+ def ==(h) #:nodoc:
23
34
  @q==h.q && @r==h.r
24
35
  end
25
36
 
26
- # Force the border status of the hex
37
+ # Force the border status of the hex.
38
+ #
39
+ # *Returns* : true.
27
40
  def border!
28
41
  @border = true
29
42
  end
30
43
 
31
- # Get the border status of the hex
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).
32
47
  def border?
33
48
  !@border.nil?
34
49
  end
35
50
 
36
- # Transform flat topped axial represented hexagon object to flat topped cube represented hexagon object
51
+ # Transform an axial represented hexagon object to a cube represented hexagon object.
52
+ #
53
+ # *Returns* : a new Hex::Cube object.
37
54
  def to_cube
38
55
  Hex::Cube.new(@q,-@q-@r,@r)
39
56
  end
40
57
 
41
- # From an array of hexagones, get the nearest
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.
42
70
  def nearest_hex( hex_array )
43
71
  nearest_hex = nil
44
72
  current_distance = nil
@@ -53,26 +81,46 @@ module Hex
53
81
  nearest_hex
54
82
  end
55
83
 
56
- # Get the distance (in hex) between two hexagons
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.
57
99
  def distance( h )
58
100
  to_cube.distance(h.to_cube)
59
101
  end
60
102
 
61
103
  # Get all hexagons surrounding the current hexagon
104
+ #
105
+ # *Returns* : an array of Hex::Axial.
62
106
  def get_surrounding_hexs
63
107
  # puts self.inspect, self.q.inspect, self.r.inspect
64
108
  DIRECTIONS.map{ |e| Hex::Axial.new( @q+e[0], @r+e[1] ) }
65
109
  end
66
110
 
67
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
68
114
  def hex_surrounding_hex?(hex)
69
115
  distance(hex)==1
70
116
  end
71
117
 
72
118
  # Round an hexagon coordinates (useful after pixel to axial coordinate transformation)
73
- # def round
74
- # to_cube.round.to_axial
75
- # end
119
+ #
120
+ # *Returns* : an Hex::Axial with coords rounded.
121
+ def round
122
+ to_cube.round.to_axial
123
+ end
76
124
 
77
125
  end
78
126
  end
data/lib/hex/cube.rb CHANGED
@@ -1,39 +1,57 @@
1
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.
2
9
  class Cube
3
10
 
4
- attr_reader :x,:y,:z
11
+ attr_reader :x,:y,:z #:nodoc:
5
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.
6
17
  def initialize(x,y,z)
7
18
  @x = x
8
19
  @y = y
9
20
  @z = z
10
21
  end
11
22
 
12
- # Transform a cube represented hexagon to an Hexagon::Axial represented hexagon
23
+ # Transform a cube represented hexagon to an Hexagon::Axial represented hexagon
24
+ #
25
+ # *Returns* : a new Hex::Axial object.
13
26
  def to_axial
14
27
  Hex::Axial.new(@x,@z)
15
28
  end
16
29
 
17
- # Round an float coordonate hexagon to an integer hexagon
18
- # def round
19
- # rx=@x.round(0)
20
- # ry=@y.round(0)
21
- # rz=@z.round(0)
22
- #
23
- # x_diff=(rx-@x).abs
24
- # y_diff=(ry-@y).abs
25
- # z_diff=(rz-@z).abs
30
+ # Round the float coordinates to integer coordinates.
26
31
  #
27
- # if x_diff > y_diff and x_diff > z_diff
28
- # rx = -ry-rz
29
- # elsif y_diff > z_diff
30
- # ry = -rx-rz
31
- # else
32
- # rz = -rx-ry
33
- # end
34
- # Hex::Cube.new(rx,ry,rz)
35
- # end
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)
36
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.
37
55
  def distance(h)
38
56
  [(@x - h.x).abs, (@y - h.y).abs, (@z - h.z).abs].max
39
57
  end
data/lib/hex/grid.rb CHANGED
@@ -3,11 +3,30 @@ require_relative 'grid_to_pic'
3
3
  require_relative 'ascii_to_grid'
4
4
 
5
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.
6
10
  class Grid
7
11
 
8
12
  include GridToPic
9
13
  include AsciiToGrid
10
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.
11
30
  def initialize( hex_ray: 16, element_to_color_hash: {} )
12
31
  @hexes={}
13
32
  @element_to_color_hash = element_to_color_hash
@@ -16,39 +35,48 @@ module Hex
16
35
  end
17
36
 
18
37
  # Create an hexagon at a given position (q, r)
19
- # You can set a value for the hexagon and set the hex as a border hex or not
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.
20
42
  def cset( q, r, val: nil, border: false )
21
43
  @hexes[ [ q, r ] ] = Hex::Axial.new( q, r, val: val, border: border )
22
44
  end
23
45
 
24
- # Same method, but accept an hexagon instead of (q, r) coords
46
+ # Same method, but accept an hexagon instead of (q, r) coords
47
+ #
48
+ # *Returns* : the created Hex::Axial object.
25
49
  def hset( hex, val: nil, border: false )
26
50
  @hexes[ [ hex.q, hex.r ] ] = Hex::Axial.new( hex.q, hex.r, val: val, border: border )
27
51
  end
28
52
 
29
53
  # Get the hexagon at a given position (q, r)
54
+ #
55
+ # *Returns* : the created Hex::Axial object.
30
56
  def cget( q, r )
31
57
  @hexes[ [ q, r ] ]
32
58
  end
33
59
 
34
- # Same method, but accept an hexagon instead of (q, r) coords
60
+ # Same method, but accept an hexagon instead of (q, r) coords
61
+ #
62
+ # *Returns* : the created Hex::Axial object.
35
63
  def hget( hex )
36
64
  @hexes[ [ hex.q, hex.r ] ]
37
65
  end
38
66
 
39
- # Create an hexagon object from (x,y) coordinate
40
- # q = (x * sqrt(3)/3 - y / 3) / size
41
- # r = y * 2/3 / size
42
- # return hex_round(Hex(q, r))
43
- # def hex_at_xy(x, y)
44
- # # x-=@hex_width/2.0
45
- # # y-=@hex_height/2.0
46
- # q = (x * Math.sqrt(3)/3.0 - y/3.0) / @hex_ray
47
- # r = y * 2.0/3.0 / @hex_ray
48
- # Hex::Axial.new(q, r).round
49
- # end
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
+ hget( hex )
75
+ end
50
76
 
51
77
  # Give the position of an hexagon object in pixel.
78
+ #
79
+ # *Returns* : an array of x, y positions.
52
80
  def to_xy( hex )
53
81
  tmp_q = hex.q - ( hex.r/2.0 ).floor
54
82
  x = @hex_ray * Math.sqrt(3) * ( tmp_q + hex.r/2.0 )
@@ -7,10 +7,17 @@ rescue Gem::LoadError
7
7
  puts 'Caution : Rmagick is not installed'
8
8
  end
9
9
 
10
+ # This module contain methods to draw a grid to a picture file.
11
+ # It is included in Grid.
10
12
  module GridToPic
11
13
 
12
- attr_reader :hex_height, :hex_width
14
+ attr_reader :hex_height, :hex_width #:nodoc:
13
15
 
16
+ # Draw a picture of the hexagon grid
17
+ # - +pic_name+ : the name of the picture file (can be *.bmp, *.png, *.jpg)
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
+ #
20
+ # *Returns* : true if the file was created successfully, false otherwise.
14
21
  def to_pic( pic_name, exit_on_error = true )
15
22
  unless defined?( Magick::Image ) && defined?( Magick::HatchFill ) && defined?( Magick::Draw )
16
23
  puts 'Rmagick is not installed !!! You can\'t dump hex grid to pic'
@@ -31,6 +38,8 @@ module GridToPic
31
38
  canvas.write( pic_name )
32
39
  end
33
40
 
41
+ private
42
+
34
43
  def set_hex_dimensions
35
44
 
36
45
  @hex_height = @hex_ray * 2.0
@@ -41,8 +50,6 @@ module GridToPic
41
50
 
42
51
  end
43
52
 
44
- private
45
-
46
53
  def get_color( hex )
47
54
  color = @element_to_color_hash[ hex.val ]
48
55
  color ? color : :white
metadata CHANGED
@@ -1,19 +1,19 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rhex
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.1
4
+ version: 1.2.2
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: 2015-12-28 00:00:00.000000000 Z
11
+ date: 2015-12-31 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: |2
14
- A library designed to provide hexagonal grids for ruby.
15
- Provide various hex methods (surrounding hexes, nearest hex, distance between two hexes).
16
- Provide also a method to create a grid from an ascii map and a method to dump your hex grid to a bitmap file (require rmagick).
14
+ A library providing hexagons management and hexagonal grids for ruby.
15
+ Misc methods (surrounding hexes, nearest hex, distance between hexes).
16
+ Can also create an hex grid from an ascii file and dump an hex grid to a picture.
17
17
  email:
18
18
  executables: []
19
19
  extensions: []