﻿#!/usr/bin/env ruby -w
# encoding: UTF-8
class C卵刷新器
  包含模块 M代理控制反转
  可读属性 :密度, :周期#密度为100*100区域中卵的数量, 可以为小数
  def 初始化(密度, 周期, 区域, 添加方法, 增长系数 = 2.0, 刷新间隔 = 200)
    @密度, @周期, @区域, @添加方法, @增长系数, @刷新间隔 = 密度, 周期, 区域, 添加方法, 增长系数, 刷新间隔
    @卵半径 = $琼脂配置.卵质量.开根.向下取整
    @区块数组 = @区域.网格(:体).区块二维数组.重整(1)
    @获取区块纤程 = R纤程.新建{循环{@区块数组.打乱.每个{|区块| R纤程.让出(区块)}}}
    @每个区块卵数 = (@区域.面积 / 10000.0 * @密度) / @区块数组.大小
    @单次刷新区块数 = @刷新间隔 / (周期 / @增长系数 / @区块数组.大小)
    卵初始化
  end
  
  初始化执行 do
    添加初始事件(C时间轴事件.新建(:刷新, @刷新间隔))
  end
  
  def 获取区块;@获取区块纤程.恢复 end
  def 卵初始化
    每个区块初始卵数 = @每个区块卵数 / 2
    @区块数组.每个{|区块| 刷新区块(区块, 每个区块初始卵数)}
  end
  def 刷新
    @单次刷新区块数.随机化整.次{刷新区块(获取区块)}
    追加事件(C时间轴事件.新建(:刷新, @刷新间隔))
  end
  def 刷新区块(区块, 刷新卵数 = 刷新卵数计算(区块))
    刷新卵数.随机化整.次 do
      坐标 = 区块.区域.随机点
      卵区域 = D圆形区域.新建(坐标, @卵半径)
      添加卵(坐标) unless 区块.任意相交?(卵区域)
    end
  end
  def 刷新卵数计算(区块)
    现有卵数 = 区块.数量{|体| 体.字符串 == '卵'}
    (@每个区块卵数 - 现有卵数) / @增长系数
  end
  def 添加卵(坐标);@添加方法.调用(坐标) end
  def 名称;'卵刷新器' end
end
