class Straightedge::Toolkit::Rose

Attributes

directions[R]

Public Class Methods

extended() click to toggle source
# File lib/straightedge/toolkit/rose.rb, line 47
def extended
  return @extended_rose unless @extended_rose.nil?
  simple_rose_axes = [[:east,:west],[:north, :south]]
  extended_directions = permute(simple, simple_rose_axes)
  all_directions = simple.directions.merge(extended_directions)
  @extended_rose = new directions: all_directions
end
hexagonal() click to toggle source

for hex navigation (nb coords are in cube-space) TODO use for hex oriented grids

# File lib/straightedge/toolkit/rose.rb, line 35
def hexagonal
  return @hex_rose unless @hex_rose.nil?
  @hex_rose = new directions: {
    :north     => [1, -1, 0],
    :northeast => [0, -1, 1],
    :northwest => [1, 0, -1],
    :south     => [-1, 1, 0],
    :southeast => [-1, 0, 1],
    :southwest => [0, 1, -1]
  }
end
new(directions:{}) click to toggle source
# File lib/straightedge/toolkit/rose.rb, line 6
def initialize(directions:{})
  @directions = directions
end
permute(rose, axes) click to toggle source
# File lib/straightedge/toolkit/rose.rb, line 55
def permute(rose, axes)
  combinations = axes.x.map do |x|
    axes.y.map do |y|
      ["#{y}#{x}".to_sym, Ruler.translate(rose.directions[x], rose.directions[y])]
    end
  end

  Hash[combinations.flatten(1)]
end
simple() click to toggle source
# File lib/straightedge/toolkit/rose.rb, line 23
def simple
  return @simple_rose unless @simple_rose.nil?
  @simple_rose = new directions: {
    :north => [0, -1],
    :south => [0,  1],
    :east  => [1,  0],
    :west  => [-1, 0]
  } 
end

Public Instance Methods

orbit(point) click to toggle source
# File lib/straightedge/toolkit/rose.rb, line 10
def orbit(point)
  @directions.values.collect do |delta|
    Ruler.translate(point, delta)
  end
end
orbits(points, depth: 1) click to toggle source
# File lib/straightedge/toolkit/rose.rb, line 16
def orbits(points, depth: 1)
  return if depth.zero?
  obs = points.map(&method(:orbit)).flatten(1)
  (obs + orbits(obs, depth: depth-1)).uniq
end