Spaces:
Running
Running
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] | |
}) | |
// Set half the student to have plagerized. | |
var studentsPlagerizedArray = _.sortBy(d3.range(students.length).map(i => i % 2 == 0), () => rand()) | |
// var remainingPlagerizedArray = _.sortBy(d3.range(allStudents.length - 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.plagerized = addVec([x, y], group.pos) | |
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() | |