class Waxy::Geometry::Layout

Attributes

orientation[RW]
pad_h_offset[R]
pad_w_offset[R]
padding[RW]

pixels between hexes !! Padding is applied at render time, not geometry compute time, i.e. using this will currently !! break things like pixel_to_hex

Public Class Methods

new(_orientation, _size, _origin, _padding = 0.0) click to toggle source
# File lib/waxy/geometry/layout.rb, line 22
def initialize(_orientation, _size, _origin, _padding = 0.0) 
  @orientation = _orientation
  @size = _size
  @origin = _origin 
  @padding = _padding
  reset_padding
end

Public Instance Methods

hex_corner_angle(corner) click to toggle source

@param corner [Integer]

# File lib/waxy/geometry/layout.rb, line 56
def hex_corner_angle(corner)
  2.0 * Math::PI * (orientation.start_angle + corner) / 6
end
hex_corner_offset(corner, s = nil) click to toggle source

@param corner [Integer]

# File lib/waxy/geometry/layout.rb, line 49
def hex_corner_offset(corner, s = nil)
  s ||= size
  angle = hex_corner_angle(corner)
  Waxy::Geometry::Point.new(s.x * Math.cos(angle), s.y * Math.sin(angle))
end
hex_to_pixel(hex) click to toggle source
# File lib/waxy/geometry/layout.rb, line 30
def hex_to_pixel(hex)
  m = orientation
  x = (m.f0 * hex.q + m.f1 * hex.r) * size.x
  y = (m.f2 * hex.q + m.f3 * hex.r) * size.y

  Waxy::Geometry::Point.new(x + origin.x,  y + origin.y)
end
increase_h_padding() click to toggle source
# File lib/waxy/geometry/layout.rb, line 118
def increase_h_padding
  @pad_h_offset += padding
end
increase_w_padding() click to toggle source
# File lib/waxy/geometry/layout.rb, line 122
def increase_w_padding
  @pad_w_offset += padding
end
pixel_to_hex(p) click to toggle source
# File lib/waxy/geometry/layout.rb, line 38
def pixel_to_hex(p)
  m = orientation
  pt = Waxy::Geometry::Point.new((p.x - origin.x) / size.x,
                                 (p.y - origin.y) / size.y)
  q = m.b0 * pt.x + m.b1 * pt.y
  r = m.b2 * pt.x + m.b3 * pt.y

  Waxy::Geometry::FractionalHex.new(q, r, q * -1.0,  r * -1.0)
end
point(hex, i, scale = 1.0 ) click to toggle source

Departing from Redblob here

# File lib/waxy/geometry/layout.rb, line 76
def point(hex, i, scale = 1.0 )
  center = hex_to_pixel(hex)

  resized = size.dup
  resized.x = resized.x * scale
  resized.y = resized.y * scale 

  offset = hex_corner_offset(i, resized)

  Waxy::Geometry::Point.new( center.x + offset.x, center.y + offset.y  ) 
end
polygon_corners(h) click to toggle source

@params h [Waxy::Geometry::Hex]

# File lib/waxy/geometry/layout.rb, line 61
def polygon_corners(h)
  corners = []
  center = hex_to_pixel(h)
  (0..5).each do |i|
    offset = hex_corner_offset(i) 

    corners.push Waxy::Geometry::Point.new(
      center.x + offset.x,
      center.y + offset.y)
  end
  corners
end
reset_h_padding() click to toggle source
# File lib/waxy/geometry/layout.rb, line 110
def reset_h_padding
  @pad_h_offset = 0.0
end
reset_padding() click to toggle source

Padding methods are not part of Amit's original code. They are not integrated into geometry compute.

# File lib/waxy/geometry/layout.rb, line 105
def reset_padding
  reset_h_padding
  reset_w_padding
end
reset_w_padding() click to toggle source
# File lib/waxy/geometry/layout.rb, line 114
def reset_w_padding
  @pad_w_offset = 0.0
end
triangle(hex, i) click to toggle source
# File lib/waxy/geometry/layout.rb, line 88
def triangle(hex, i)
  scale = hex.size[i]

  points = [ hex_to_pixel(hex) ] 
  points.push point(hex, i, scale)
  points.push point(hex, (i + 1 == 6 ? 0 : i + 1), scale) 
  points
end
triangles(hex) click to toggle source
# File lib/waxy/geometry/layout.rb, line 97
def triangles(hex)
  (0..5).each_with_index.collect{|t,i| triangle(hex, i) }
end