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() | |