|
window.makeStudents = function(){ |
|
var seed = new Math.seedrandom('12fbsab56') |
|
var rand = d3.randomUniform.source(seed)(0, 1) |
|
|
|
var ncols = 12 |
|
|
|
var allStudents = d3.range(756).map(i => { |
|
var age = ages[Math.floor(rand()*ages.length)] |
|
var state = states[Math.floor(rand()*states.length)] |
|
var season = Math.floor(rand()*4) |
|
var heads = rand() < .5 |
|
|
|
if (rand() < .1) state = 'NY' |
|
if (rand() < .5 && state == 'RI') state = states[Math.floor(rand()*states.length)] |
|
if (rand() < .5 && state == 'CT') state = states[Math.floor(rand()*states.length)] |
|
|
|
var coinVals = d3.range(300).map(rand).slice(0, 200) |
|
|
|
return {age, state, i, pos: {}, group: {}, season, heads, coinVals, isAdditionalStudent: true} |
|
}) |
|
|
|
var students = allStudents.slice(0, 144) |
|
students.forEach(student => student.isAdditionalStudent = false) |
|
|
|
students.all = allStudents |
|
students.all.forEach((d, i) => { |
|
var x = (i % 25)/25*c.width |
|
var y = ~~(i/25)/25*c.width |
|
d.pos.all = [x, y] |
|
}) |
|
|
|
var {bw, ageScale, stateScale} = axii |
|
_.sortBy(students, d => -d.age).forEach((d, i) => { |
|
var x = (i % ncols)/(ncols - 1)*c.width |
|
var y = ~~(i/ncols)/(ncols - 1)*c.width |
|
d.pos.grid = [x, y] |
|
scale = .6 |
|
d.pos.smallGrid = [x * scale + 90, y * scale] |
|
}) |
|
|
|
|
|
var studentsPlagerizedArray = _.sortBy(d3.range(students.length).map(i => i % 2 == 0), () => rand()) |
|
|
|
remainingPlagerizedArray = d3.range(students.all.length).map(i => i % 2 == 1) |
|
var plagerizedArray = studentsPlagerizedArray.concat(remainingPlagerizedArray) |
|
students.all.forEach((d, i) => d.plagerized = plagerizedArray[i]) |
|
|
|
students.byAge = d3.nestBy(students, d => d.age) |
|
students.byAge.forEach(age => { |
|
age.forEach((d, i) => { |
|
d.pos.age = [i*10, ageScale(d.age) + bw] |
|
}) |
|
}) |
|
students.byAgeState = d3.nestBy(students, d => d.age + d.state) |
|
students.byAgeState.forEach(group => { |
|
var d0 = group.d0 = group[0] |
|
group.pos = [bw + stateScale(d0.state), bw + ageScale(d0.age)] |
|
|
|
var angle = Math.PI*(3 - Math.sqrt(5))*(1 + Math.random()*.05 - .05/2) |
|
group.forEach((d, i) => { |
|
d.pos.ageState = addVec(phyllotaxis(i, 10.5, angle), group.pos) |
|
d.group.ageState = group |
|
}) |
|
}) |
|
|
|
students.byAgeStateSeason = d3.nestBy(students, d => d.age + d.state + d.season) |
|
students.byAgeStateSeason.forEach(group => { |
|
var d0 = group.d0 = group[0] |
|
group.pos = [bw + stateScale(d0.state), bw*d0.season/2 + ageScale(d0.age)] |
|
|
|
group.forEach((d, i) => { |
|
d.pos.ageStateSeason = addVec([i*11 - group.length*11/2 + 6, 12], group.pos) |
|
d.group.ageStateSeason = group |
|
}) |
|
}) |
|
|
|
|
|
students.updateHeadsPos = function(){ |
|
students.byHeads = d3.nestBy(students, d => d.coinVals[estimates.active.index] < sliders.headsProb) |
|
students.byHeads.forEach(group => { |
|
group.pos = [group.key == 'true' ? c.width/4 -15 : c.width/4*3 +15, c.height/2] |
|
|
|
group.forEach((d, i) => { |
|
d.pos.heads = addVec(phyllotaxis(i, 12), group.pos) |
|
d.group.heads = group |
|
}) |
|
}) |
|
} |
|
|
|
students.plagerizedGroup = d3.nestBy(_.sortBy(students.all, d => d.plagerized), d => d.plagerized) |
|
students.plagerizedGroup.forEach((group, groupIndex) => { |
|
var d0 = group.d0 = group[0] |
|
var offset = -20 |
|
group.pos = [(d0.plagerized ? c.width/2 + offset : c.width/2 - offset), c.height/2 - 80] |
|
|
|
|
|
var getOrderedPositions = function() { |
|
positions = [] |
|
|
|
var step = 25 |
|
var top = 0 |
|
var bottom = 0 |
|
var right = 0 |
|
|
|
var addAbove = function(dirPositive=true) { |
|
var y = (top + 1) * step |
|
var x = 0 |
|
while (x <= right * step) { |
|
positions.push([dirPositive ? x: (right * step - x), y]) |
|
x += step |
|
} |
|
top++ |
|
} |
|
|
|
var addRight = function(dirPositive=true) { |
|
var x = (right + 1) * step |
|
var y = bottom * step |
|
while (y <= top * step) { |
|
positions.push([x, dirPositive ? y: -y]) |
|
y += step |
|
} |
|
right++ |
|
} |
|
|
|
var addBelow = function(dirPositive=true) { |
|
var y = (bottom - 1) * step |
|
var x = 0 |
|
while (x <= right * step) { |
|
positions.push([dirPositive ? x: (right * step - x), y]) |
|
x += step |
|
} |
|
bottom-- |
|
} |
|
|
|
var addForward = function() { |
|
addAbove(true) |
|
addRight(false) |
|
addBelow(false) |
|
} |
|
|
|
var addBackward = function() { |
|
addBelow(true) |
|
addRight(true) |
|
addAbove(false) |
|
} |
|
|
|
isForward = true |
|
while(positions.length < students.all.length) { |
|
if (positions.length === 0) { |
|
positions.push([0, 0]) |
|
addRight() |
|
addBelow() |
|
} else { |
|
if (isForward) { |
|
addForward() |
|
} else { |
|
addBackward() |
|
} |
|
isForward = !isForward |
|
} |
|
} |
|
return positions |
|
} |
|
|
|
var populationPositions = getOrderedPositions() |
|
var reversePositions = populationPositions.map(pos => [-pos[0], pos[1]]) |
|
|
|
group.forEach((d, i) => { |
|
var x = (i % 7)/20*c.width |
|
var y = ~~(i/7)/20*c.width |
|
|
|
d.pos.plagerizedShifted = addVec([x, y - 50], group.pos) |
|
d.group.plagerized = group |
|
|
|
d.pos.plagerizedShifted = addVec((groupIndex === 0) ? populationPositions[i]: reversePositions[i], group.pos) |
|
}) |
|
}) |
|
|
|
|
|
students.rand = rand |
|
return students |
|
} |
|
|
|
if (window.init) window.init() |
|
|