|
window.makeSliders = function(){ |
|
var rv = { |
|
population: 144, |
|
headsProb: .5, |
|
} |
|
|
|
rv.updateHeadsProb = (headsProb) => { |
|
rv.headsProb = headsProb |
|
updateSliderPos() |
|
|
|
|
|
estimates.updateEstimates() |
|
estimates.render() |
|
} |
|
|
|
rv.updatePopulation = (population) => { |
|
rv.population = population |
|
updateSliderPos() |
|
|
|
|
|
var scale = d3.clamp(0, 13 / Math.sqrt(population), 1) |
|
sel.studentGroup.st({ |
|
transformOrigin: 'top', |
|
transformOrigin: c.width/2 + 'px ' + 160 + 'px', |
|
transform: `scale(${scale})` |
|
}) |
|
|
|
estimates.updateEstimates() |
|
estimates.render() |
|
|
|
sel.student.classed('inactive',(d, i) => i >= population) |
|
} |
|
|
|
rv.updatePopulationSlider = (val) => { |
|
rv.updatePopulation(val) |
|
} |
|
|
|
rv.updateNoiseSlider = (val) => { |
|
rv.updateHeadsProb(val) |
|
} |
|
|
|
var updateSliderPos = (function(){ |
|
var width = d3.clamp(50, window.innerWidth/2 - 40, 145) |
|
var height = 30 |
|
var color = '#007276' |
|
|
|
var sliderVals = { |
|
population: { |
|
key: 'population', |
|
textFn: d => rv.population + ' students' , |
|
r: [144, 756], |
|
v: 144, |
|
stepFn: d => rv.updatePopulation(Math.round(d.v/2)*2), |
|
}, |
|
headsProb: { |
|
key: 'headsProb', |
|
textFn: d => d3.format('.1%')(rv.headsProb) + ' chance of heads', |
|
r: [.2, .5], |
|
v: .5, |
|
stepFn: d => rv.updateHeadsProb(d.v), |
|
} |
|
} |
|
var sliders = [sliderVals.headsProb, sliderVals.population, sliderVals.headsProb] |
|
sliders.forEach(d => { |
|
d.s = d3.scaleLinear().domain(d.r).range([0, width]) |
|
}) |
|
|
|
var sliderSel = d3.selectAll('.slide-container-population,.slide-container-heads-prob').html('') |
|
.data(sliders) |
|
.classed('slider', true) |
|
.st({ |
|
display: 'inline-block', |
|
width: width, |
|
paddingRight: (d, i) => i == 1 ? 40 : 0, |
|
marginTop: 20, |
|
}) |
|
|
|
var textSel = sliderSel.append('div.slider-label-container') |
|
.st({marginBottom: -5}) |
|
|
|
var svgSel = sliderSel.append('svg').at({width, height}) |
|
.on('click', function(d){ |
|
d.v = d.s.invert(d3.mouse(this)[0]) |
|
d.stepFn(d) |
|
}) |
|
.st({ |
|
cursor: 'pointer' |
|
}) |
|
.append('g').translate(height/2, 1) |
|
svgSel.append('rect').at({width, height, y: -height/2, fill: 'rgba(0,0,0,0)'}) |
|
|
|
svgSel.append('path').at({ |
|
d: `M 0 -.5 H ${width}`, |
|
stroke: color, |
|
strokeWidth: 1 |
|
}) |
|
|
|
var leftPathSel = svgSel.append('path').at({ |
|
d: `M 0 -.5 H ${width}`, |
|
stroke: color, |
|
strokeWidth: 3 |
|
}) |
|
|
|
|
|
var drag = d3.drag() |
|
.on('drag', function(d){ |
|
var x = d3.mouse(this)[0] |
|
d.v = d3.clamp(d3.min(d.r), d.s.invert(x), d3.max(d.r)) |
|
d.stepFn(d) |
|
}) |
|
|
|
var rectSel = svgSel.append('rect') |
|
.at({ |
|
width: height/2 - 1, |
|
height: height/2 - 1, |
|
stroke: color, |
|
strokeWidth: 3, |
|
fill: '#fff', |
|
}) |
|
.translate([-height/4, -height/4]) |
|
.call(drag) |
|
|
|
return isDrag => { |
|
rectSel.at({x: d => Math.round(d.s(rv[d.key]))}) |
|
textSel.text(d => d.textFn(d)) |
|
|
|
leftPathSel.at({d: d => `M 0 -.5 H ${d.s(rv[d.key])}`}) |
|
} |
|
})() |
|
updateSliderPos() |
|
|
|
|
|
return rv |
|
} |
|
|
|
|
|
|
|
|
|
if (window.init) window.init() |