class Links extends AgentSetClass Links is a subclass of AgentSet which stores instances of Link or subclasses of Link
class Links extends AgentSetConstructor: super creates the empty AgentSet instance and installs the agentClass (breed) variable shared by all the Links in this set.
constructor: -> # model, agentClass, name, mainSet
super # call super with all the args I was called withFactory: Add 1 or more links from the from agent to the to agent(s) which can be a single agent or an array of agents. The optional init proc is called on the new link after inserting in the agentSet.
create: (from, to, init = ->) -> # returns array of new links too
to = [to] unless to.length?
((o) -> init(o); o) @add new @agentClass from, a for a in to # too tricky?Remove all links from set via link.die() Note call in reverse order to optimize list restructuring.
clear: -> @last().die() while @any(); null # tricky, each die modifies listReturn all the nodes in this agentset, with duplicates included. If 4 links have the same endpoint, it will appear 4 times.
allEnds: -> # all link ends, w/ dups
n = @asSet []
n.push l.end1, l.end2 for l in @
nReturns all the nodes in this agentset sorted by ID and with duplicates removed.
nodes: -> # allEnds without dups
@allEnds().sortById().uniq()Circle Layout: position the turtles in the list in an equally spaced circle of the given radius, with the initial turtle at the given start angle (default to pi/2 or “up”) and in the +1 or -1 direction (counter clockwise or clockwise) defaulting to -1 (clockwise).
layoutCircle: (list, radius, startAngle = Math.PI/2, direction = -1) ->
dTheta = 2*Math.PI/list.length
for a, i in list
a.setXY 0, 0
a.heading = startAngle + direction*dTheta*i
a.forward radius
null
setDraggable: () ->
@on 'dragstart', (mouseEvent) =>
mouseEvent.target.dragging = true
@on 'dragend', (mouseEvent) =>
mouseEvent.target.dragging = false
@on 'drag', (mouseEvent) =>
end1 = mouseEvent.target.end1
end2 = mouseEvent.target.end2
end1.setXY(end1.x - mouseEvent.dx, end1.y - mouseEvent.dy)
end2.setXY(end2.x - mouseEvent.dx, end2.y - mouseEvent.dy)