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. | |
| ==============================================================================*/ | |
| var sliderVals = {} | |
| var sliders = [ | |
| { | |
| key: 'fNoiseMag', | |
| text: 'Feature Noise', | |
| r: [0, 1], | |
| v: .5 | |
| }, | |
| { | |
| key: 'fBiasMag', | |
| text: 'Feature Bias', | |
| r: [0, 1], | |
| v: .2 | |
| }, | |
| ] | |
| !(function(){ | |
| var width = 145 | |
| var height = 30 | |
| sliders.forEach(d => { | |
| d.s = d3.scaleLinear().domain(d.r).range([0, width]) | |
| sliderVals[d.key] = d | |
| }) | |
| var sliderSel = d3.select('.slider').html('') | |
| .appendMany('div', sliders) | |
| .at({class: d => d.key}) | |
| .st({ | |
| display: 'inline-block', | |
| width: width, | |
| paddingRight: 60, | |
| marginTop: 20, | |
| color: '#000' | |
| }) | |
| sliderSel.append('div') | |
| .text(d => d.text) | |
| .st({marginBottom: height/2}) | |
| var svgSel = sliderSel.append('svg').at({width, height}) | |
| .on('click', function(d){ | |
| d.v = d.s.invert(d3.mouse(this)[0]) | |
| updatePos() | |
| }) | |
| .st({ | |
| cursor: 'pointer' | |
| }) | |
| .append('g').translate(height/2, 1) | |
| svgSel.append('rect').at({width, height, y: -height/2, fill: '#fff'}) | |
| svgSel.append('path').at({ | |
| d: `M 0 0 H ${width}`, | |
| stroke: '#000', | |
| strokeWidth: 2 | |
| }) | |
| 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)) | |
| updatePos() | |
| }) | |
| var circleSel = svgSel.append('circle') | |
| .at({ | |
| r: height/2, | |
| stroke: '#000', | |
| strokeWidth: 2, | |
| fill: '#fff', | |
| }) | |
| .call(drag) | |
| function updatePos(){ | |
| circleSel.at({cx: d => d.s(d.v)}) | |
| if (sliderVals.onUpdate) sliderVals.onUpdate() | |
| } | |
| updatePos() | |
| sliderVals.updatePos = updatePos | |
| })() | |