Spaces:
Running
Running
| /* Copyright 2020 Google LLC. All Rights Reserved. | |
| Licensed under the Apache License, Version 2.0 (the "License"); | |
| you may not use this file except in compliance with the License. | |
| You may obtain a copy of the License at | |
| http://www.apache.org/licenses/LICENSE-2.0 | |
| Unless required by applicable law or agreed to in writing, software | |
| distributed under the License is distributed on an "AS IS" BASIS, | |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| See the License for the specific language governing permissions and | |
| limitations under the License. | |
| ==============================================================================*/ | |
| window.makeStudents = function(){ | |
| var seed = new Math.seedrandom('he4a15') | |
| var rand = d3.randomUniform.source(seed)(0, 1) | |
| var letters = 'abcdefgijlmnopqrsuvwxyz' | |
| letters = (letters + letters.toUpperCase()).split('') | |
| var nSickCols = 6 | |
| var mSickCols = 8 | |
| var fSickCols = nSickCols*2 - mSickCols | |
| var students = d3.range(nCols*nCols).map(i => { | |
| var letter = letters[~~d3.randomUniform.source(seed)(0, letters.length)()] | |
| var isMale = i % 2 == 0 | |
| var isSick = i < (isMale ? mSickCols : fSickCols)*nCols | |
| var grade = isSick*.5 + rand() | |
| var pos = {} | |
| return {letter, isSick, isMale, grade, pos} | |
| }) | |
| students = _.sortBy(students, d => -d.grade) | |
| d3.nestBy(students, d => d.isSick).forEach(group => { | |
| var isSick = group[0].isSick | |
| var sickCols = nSickCols | |
| var cols = isSick ? sickCols : nCols - sickCols | |
| var xOffset = isSick ? 0 : sickCols | |
| group.forEach((d, i) => { | |
| d.pos.allIJ = [cols - 1 - (i % cols) + xOffset, ~~(i/cols)] | |
| var spreadIJ = d.pos.allIJ.slice() | |
| if (!d.isSick) spreadIJ[0] += .1 | |
| d.pos.all = spreadIJ.map(d => d*c.width/10) | |
| }) | |
| }) | |
| d3.nestBy(students, d => d.isSick + '-' + d.isMale).forEach(group => { | |
| var isSick = group[0].isSick | |
| var isMale = group[0].isMale | |
| var sickCols = isMale ? mSickCols : fSickCols | |
| var cols = isSick ? sickCols : nCols - sickCols | |
| var xOffset = isSick ? 0 : sickCols | |
| var yOffset = isMale ? nCols/2 + 2 : 0 | |
| group.forEach((d, i) => { | |
| d.pos.sexIJ = [cols - 1 - (i % cols) + xOffset, ~~(i/cols) + yOffset] | |
| d.pos.sexGroupIJ = [cols - 1 - (i % cols) + xOffset, ~~(i/cols)] | |
| var spreadIJ = d.pos.sexIJ.slice() | |
| if (!d.isSick) spreadIJ[0] += .1 | |
| d.pos.sex = spreadIJ.map(d => d*c.width/10) | |
| }) | |
| }) | |
| students.maleOffsetJ = nCols/2 + 2 | |
| students.maleOffsetPx= students.maleOffsetJ*c.width/10 | |
| students.fSickCols = fSickCols | |
| students.mSickCols = mSickCols | |
| students.colWidth = c.width/10 | |
| students.rand = rand | |
| return students | |
| } | |
| if (window.init) window.init() | |