class PatchClass Patch instances represent a rectangle on a grid. They hold variables that are in the patches the turtles live on. The set of all patches (@model.patches) is the world on which the turtles live and the model runs.
class PatchConstructor & Class Variables:
Patches may not need their neighbors, thus we use a default of none. n and n4 are promoted by the Patches agentset if world.neighbors is true, the default.
id: null # unique id, promoted by agentset create factory method
breed: null # set by the agentSet owning this patch
x:null; y:null # The patch position in the patch grid
n:null; n4:null # The neighbors, n: 8, n4: 4. null OK if model doesn't need them.color: [0,0,0] # The patch color
hidden: false # draw me?
label: null # text for the patchlabelColor: [0,0,0] # text color
labelOffset: [0,0] # text offset from the patch center
pRect: null # Performance: cached rect of neighborhood larger than n.New Patch: Just set x,y. Neighbors set by Patches constructor if needed.
constructor: (@x, @y) ->Return a string representation of the patch.
toString: -> "{id:#{@id} xy:#{[@x,@y]} c:#{@color}}"Set patch color to c scaled by s. Usage:
p.scaleColor p.color, .8 # reduce patch color by .8
p.scaleColor @foodColor, p.foodPheromone # ants model
Promotes color if currently using the default.
scaleColor: (c, s) ->@color = u.clone @color unless @hasOwnProperty(“color”) u.scaleColor c, s, @color
u.deprecated "Patch.scaleColor: use ColorMaps ramps or closestColor"
@color = ColorMaps.scaleColor(c, s)
scaleOpacity: (c, s) ->
u.deprecated "Patch.scaleOpacity: use ColorMaps ramps"
@color = u.scaleOpacity c, s, @color@color = u.clone @color unless @.hasOwnProperty(“color”) u.scaleOpacity c, s, @color
Draw the patch and its text label if there is one.
draw: (ctx) ->
u.deprecated "Patch.draw not used, Patches.draw uses pixels"
ctx.fillStyle = @color.css # u.colorStr @color
ctx.fillRect @x-.5, @y-.5, 1, 1
if @label? # REMIND: should be 2nd pass.
[x,y] = @breed.patchXYtoPixelXY @x, @y
u.ctxDrawText ctx, @label,
x+@labelOffset[0], y+@labelOffset[1], @labelColor.cssReturn the members of the agentset within radius of me
inRadius: (agentSet, radius) -> agentSet.inRadius @, radiusReturn an array of the turtles/breeds on this patch. If patches.cacheTurtlesHere has created an @turtles instance variable for the patches, turtles will add/remove themselves as they move from patch to patch.
turtlesHere: ->
u.deprecated "Patch.turtlesHere: make caching default" unless @turtles
@turtles ? (a for a in @model.turtles when a.p is @)
breedsHere: (breed) ->
(a for a in @turtlesHere() when a.breed is breed)Returns true if this patch is on the edge of the grid.
isOnEdge: ->
@x is @breed.minX or @x is @breed.maxX or \
@y is @breed.minY or @y is @breed.maxYFactory: Create num new turtles on this patch. The optional init function is called on the new turtle after inserting in its agentset.
sprout: (num = 1, breed = @model.turtles, init = ->) ->
breed.create num, (a) => # fat arrow so that @ = this patch
a.setXY @x, @y; init(a); ause colorMixin to setup colors
colorMixin(Patch,"color","black")
colorMixin(Patch,"labelColor","black")