Class: MagicCloud::Layouter::Place
- Inherits:
-
Object
- Object
- MagicCloud::Layouter::Place
- Defined in:
- lib/magic_cloud/layouter/place.rb
Overview
Incapsulating place lookup process
-
find initial random place
-
at each step, shift in spiral from the previous place
-
always knows, if the place “ready” for shape (empty and inside board)
Instance Method Summary collapse
-
#initialize(layouter, shape) ⇒ Place
constructor
rubocop:todo Metrics/AbcSize.
- #next! ⇒ Object
- #ready? ⇒ Boolean
Constructor Details
#initialize(layouter, shape) ⇒ Place
rubocop:todo Metrics/AbcSize
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
# File 'lib/magic_cloud/layouter/place.rb', line 13 def initialize(layouter, shape) # rubocop:todo Metrics/AbcSize @layouter, @shape = layouter, shape # initial position @start_x = (@layouter.width/2-@shape.width/2).to_i @start_y = (@layouter.height/2-@shape.height/2).to_i # when shift of position is more than max delta (diagonal of cloud) # there is no hope it will eventually found its place @max_delta = Math.sqrt(@layouter.width**2 + @layouter.height**2) # algo of next position calc @spiral = make_spiral(@shape.size) # direction of spiral @dt = rand < 0.5 ? 1 : -1 # initial point of time before we start to look for place @t = -@dt end |
Instance Method Details
#next! ⇒ Object
34 35 36 37 38 39 40 41 42 |
# File 'lib/magic_cloud/layouter/place.rb', line 34 def next! @t += @dt dx, dy = @spiral.call(@t) fail PlaceNotFound if [dx, dy].map(&:abs).min > @max_delta @shape.x = @start_x + dx @shape.y = @start_y + dy end |
#ready? ⇒ Boolean
44 45 46 |
# File 'lib/magic_cloud/layouter/place.rb', line 44 def ready? !out_of_board? && !@layouter.board.collides?(@shape) end |