rhex 1.1.0 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6deb19b3fa7658e30adc918242cfd55c6c96a831
4
- data.tar.gz: e9c1ac59f2faec0c63ba0515d45552964d4eb114
3
+ metadata.gz: 06af15a3d397116a537acb467bbc2689f637c08c
4
+ data.tar.gz: aac1063765276f0585e0cde65a53ae9fcc9c3b6f
5
5
  SHA512:
6
- metadata.gz: 98ea9582bb07c5312714d37f0e36be129eca200e1c538d8a9a728adafee915dc64209bcc26d708576fd01f0cae17f6a3927e870bf71c1ecde81b9f1500bbb746
7
- data.tar.gz: c7a8f7d08d20ab059c16f553b72a0b72784e57d7509f89f9d509518d96455cef935a9877188d8952b0f76416adcb9c4c69b6b98d8463dc38cf2e75609cfe55d7
6
+ metadata.gz: e3b945daad5e4b6a0398effd1d4d14d817789725a27cd0b1b121da3b2677500035e91bd294715b79c56bd97c3f2dc7a3a5359eff64f91a27ebd779c15425f889
7
+ data.tar.gz: c9f595a299135cdbada16d8e9329e90bfb37ef1fb5e5f821a956b328ecebb8daec97c3ec5f8568c64bbc010d1dc93fabcc1f91d21a412bfb1c7bb1112ef9c187
@@ -2,17 +2,31 @@ module AsciiToGrid
2
2
 
3
3
  def read_ascii_file( file_path )
4
4
  File.open( file_path ) do |file|
5
- r = 0
5
+
6
+ r = max_q = max_r = 0
6
7
  file.each_line do |line|
7
8
  elements = line.split
8
9
  q = 0
9
10
  elements.each do |element|
10
- set( q, r, element )
11
+ border = true if ( r == 0 || q == 0 )
12
+ cset( q, r, val: element, border: border )
11
13
  q += 1
14
+ max_q = [ max_q, q ].max
12
15
  end
13
16
  r += 1
17
+ max_r = [ max_r, r ].max
18
+ end
19
+
20
+ 0.upto( max_q - 1 ).each do |q|
21
+ hex = cget( q, max_r - 1 )
22
+ hex.border! if hex
14
23
  end
24
+
25
+ 0.upto( max_r - 1 ).each do |row|
26
+ hex = cget( max_q - 1, row )
27
+ hex.border! if hex
28
+ end
29
+
15
30
  end
16
31
  end
17
-
18
32
  end
data/lib/hex/axial.rb CHANGED
@@ -7,16 +7,15 @@ module Hex
7
7
 
8
8
  attr_reader :q, :r, :val
9
9
 
10
- R = 16
11
-
12
10
  # Directions around hex from top left clockwise
13
11
  DIRECTIONS = [ [0,-1], [1,-1], [1,0], [0,1], [-1,+1], [-1,0] ]
14
12
 
15
- # Create a new flat topped axial represented hexagon object
16
- def initialize( q, r, val = nil)
13
+ # Create a new pointy topped axial represented hexagon object
14
+ def initialize( q, r, val: nil, border: false )
17
15
  @q = q
18
16
  @r = r
19
17
  @val = val.to_sym if val
18
+ @border = border
20
19
  end
21
20
 
22
21
  # Equality between two hexagons
@@ -24,21 +23,14 @@ module Hex
24
23
  @q==h.q && @r==h.r
25
24
  end
26
25
 
27
- # Create an hexagon object from (x,y) coordinate
28
- def self.hex_at_xy(x, y)
29
- x-=R
30
- y-=R
31
- q = x * 2/3 / R
32
- r = (-x / 3 + Math.sqrt(3)/3 * y) / R
33
- Hex::Axial.new(q, r).round
26
+ # Force the border status of the hex
27
+ def border!
28
+ @border = true
34
29
  end
35
30
 
36
- # Give the position of an hexagone object in pixel
37
- def to_xy
38
- pix_r = r - ( @q/2 )
39
- x = R * 3/2 * @q
40
- y = ( ( R.to_f * Math.sqrt(3) ).round * (pix_r.to_f + @q.to_f/2.to_f) )
41
- [ x, y ]
31
+ # Get the border status of the hex
32
+ def border?
33
+ !@border.nil?
42
34
  end
43
35
 
44
36
  # Transform flat topped axial represented hexagon object to flat topped cube represented hexagon object
@@ -72,17 +64,15 @@ module Hex
72
64
  DIRECTIONS.map{ |e| Hex::Axial.new( @q+e[0], @r+e[1] ) }
73
65
  end
74
66
 
75
- # Check if an hexagon is around another exagon
67
+ # Check if an hexagon is around another hexagon
76
68
  def hex_surrounding_hex?(hex)
77
69
  distance(hex)==1
78
70
  end
79
71
 
80
- private
81
-
82
- # Round an hexagone coordinates (useful after pixel to axial coordinate transformation)
83
- def round
84
- to_cube.round.to_axial
85
- end
72
+ # Round an hexagon coordinates (useful after pixel to axial coordinate transformation)
73
+ # def round
74
+ # to_cube.round.to_axial
75
+ # end
86
76
 
87
77
  end
88
78
  end
data/lib/hex/cube.rb CHANGED
@@ -15,24 +15,24 @@ module Hex
15
15
  end
16
16
 
17
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
26
-
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
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
26
+ #
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
36
36
 
37
37
  def distance(h)
38
38
  [(@x - h.x).abs, (@y - h.y).abs, (@z - h.z).abs].max
data/lib/hex/grid.rb CHANGED
@@ -8,40 +8,52 @@ module Hex
8
8
  include GridToPic
9
9
  include AsciiToGrid
10
10
 
11
- def initialize( element_to_color_hash = {} )
11
+ def initialize( hex_ray: 16, element_to_color_hash: {} )
12
12
  @hexes={}
13
13
  @element_to_color_hash = element_to_color_hash
14
+ @hex_ray = hex_ray
15
+ set_hex_dimensions
14
16
  end
15
17
 
16
- # Position aa value at hexagon coordinate
17
- # You can use the form set( q, r, value )
18
- # Or set( hex, value )
19
- # In both case value can be nil.
20
- def set( *args )
21
- raise ArgumentError, 'Incorrect number of arguments' if args.length < 1 || args.length > 3
22
- fa=args.shift
23
- if fa.class == Hex::Axial
24
- @hexes[ [ fa.q, fa.r ] ] = Hex::Axial.new( fa.q, fa.r, args.shift )
25
- else
26
- q=fa
27
- r=args.shift
28
- @hexes[ [ q, r ] ] = Hex::Axial.new( q, r, args.shift )
29
- end
18
+ # 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
20
+ def cset( q, r, val: nil, border: false )
21
+ @hexes[ [ q, r ] ] = Hex::Axial.new( q, r, val: val, border: border )
30
22
  end
31
23
 
32
- # Get the value of stored at hexagon coordinate
33
- # You can use the form get( q, r )
34
- # Or get( hex )
35
- def get( *args )
36
- raise( ArgumentError, 'Incorrect number of arguments' ) if args.length < 1 || args.length > 2
37
- fa=args.shift
38
- if fa.class == Hex::Axial
39
- @hexes[ [ fa.q, fa.r ] ]
40
- else
41
- q=fa
42
- r=args.shift
43
- @hexes[ [ q, r ] ]
44
- end
24
+ # Same method, but accept an hexagon instead of (q, r) coords
25
+ def hset( hex, val: nil, border: false )
26
+ @hexes[ [ hex.q, hex.r ] ] = Hex::Axial.new( hex.q, hex.r, val: val, border: border )
27
+ end
28
+
29
+ # Get the hexagon at a given position (q, r)
30
+ def cget( q, r )
31
+ @hexes[ [ q, r ] ]
32
+ end
33
+
34
+ # Same method, but accept an hexagon instead of (q, r) coords
35
+ def hget( hex )
36
+ @hexes[ [ hex.q, hex.r ] ]
37
+ end
38
+
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
50
+
51
+ # Give the position of an hexagon object in pixel.
52
+ def to_xy( hex )
53
+ tmp_q = hex.q - ( hex.r/2.0 ).floor
54
+ x = @hex_ray * Math.sqrt(3) * ( tmp_q + hex.r/2.0 )
55
+ y = @hex_ray * 3.0/2.0 * hex.r
56
+ [ x, y ]
45
57
  end
46
58
 
47
59
  end
@@ -9,33 +9,38 @@ end
9
9
 
10
10
  module GridToPic
11
11
 
12
+ attr_reader :hex_height, :hex_width
13
+
12
14
  def to_pic( pic_name, exit_on_error = true )
13
15
  unless defined?( Magick::Image ) && defined?( Magick::HatchFill ) && defined?( Magick::Draw )
14
16
  puts 'Rmagick is not installed !!! You can\'t dump hex grid to pic'
15
17
  exit if exit_on_error
16
18
  end
17
19
 
18
- canvas = Magick::Image.new( 500, 500 )
20
+ maxx = @hexes.keys.map{ |k| k[0] }.max * @hex_width
21
+ maxy = @hexes.keys.map{ |k| k[1] }.max * @hex_height * 3.0/4.0
22
+
23
+ canvas = Magick::Image.new( maxx, maxy )
19
24
  gc = Magick::Draw.new
20
- width = Hex::Axial::R * 2
21
- quarter_width = width / 4.0
22
- height = Math.sqrt(3)/2 * width
23
- half_height = height / 2.0
24
-
25
- @hexes.each do |pos, hex|
26
- x, y = hex.to_xy
27
-
28
- color = get_color( hex )
29
- gc.stroke( 'black' )
30
- gc.fill( color.to_s )
31
- gc.polygon( x-quarter_width, y-half_height, x+quarter_width, y-half_height, x+quarter_width*2, y,
32
- x+quarter_width, y+half_height, x-quarter_width, y+half_height, x-quarter_width*2, y )
33
- end
25
+ gc.stroke_antialias( true )
26
+ gc.stroke( 'black' )
27
+
28
+ @hexes.each{ | _, hex| draw_hex( gc, hex ) }
34
29
 
35
30
  gc.draw(canvas)
36
31
  canvas.write( pic_name )
37
32
  end
38
33
 
34
+ def set_hex_dimensions
35
+
36
+ @hex_height = @hex_ray * 2.0
37
+ @hex_width = Math.sqrt(3)/2.0 * @hex_height
38
+
39
+ @half_width = @hex_width / 2.0
40
+ @quarter_height = @hex_height / 4.0
41
+
42
+ end
43
+
39
44
  private
40
45
 
41
46
  def get_color( hex )
@@ -43,4 +48,18 @@ module GridToPic
43
48
  color ? color : :white
44
49
  end
45
50
 
51
+ def draw_hex( gc, hex )
52
+ x, y = to_xy( hex )
53
+
54
+ color = get_color( hex )
55
+ gc.fill( color.to_s )
56
+
57
+ gc.polygon( x - @half_width, y + @quarter_height,
58
+ x, y + 2*@quarter_height,
59
+ x + @half_width, y + @quarter_height,
60
+ x + @half_width, y - @quarter_height,
61
+ x, y - 2*@quarter_height,
62
+ x - @half_width, y - @quarter_height )
63
+ end
64
+
46
65
  end
data/lib/rhex.rb CHANGED
@@ -1,3 +1,3 @@
1
- require 'hex/axial'
2
- require 'hex/cube'
3
- require 'hex/grid'
1
+ require_relative 'hex/axial'
2
+ require_relative 'hex/cube'
3
+ require_relative 'hex/grid'
metadata CHANGED
@@ -1,16 +1,21 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rhex
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.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: 2015-12-27 00:00:00.000000000 Z
11
+ date: 2015-12-28 00:00:00.000000000 Z
12
12
  dependencies: []
13
- description: A library designed to provide hexagonal grids for ruby
13
+ description: |2
14
+ A library designed to provide hexagonal grids for ruby.
15
+ - Coordinate system is axial, bitmap representation is pointy topped.
16
+ - Provide various hex methods (surrounding hexes, nearest hex, distance between two hexes)
17
+ - Provide a method to create a grid from an ascii map
18
+ - Provide a method to dump your hex grid to a bitmap file (require rmagick)
14
19
  email:
15
20
  executables: []
16
21
  extensions: []
@@ -34,7 +39,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
34
39
  requirements:
35
40
  - - ">="
36
41
  - !ruby/object:Gem::Version
37
- version: '0'
42
+ version: 2.0.0
38
43
  required_rubygems_version: !ruby/object:Gem::Requirement
39
44
  requirements:
40
45
  - - ">="
@@ -42,9 +47,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
42
47
  version: '0'
43
48
  requirements: []
44
49
  rubyforge_project:
45
- rubygems_version: 2.4.8
50
+ rubygems_version: 2.4.1
46
51
  signing_key:
47
52
  specification_version: 4
48
53
  summary: Ruby HEXagonal grid
49
54
  test_files: []
50
- has_rdoc: