You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
174 lines
4.8 KiB
174 lines
4.8 KiB
/**
|
|
*
|
|
*/
|
|
Visualizer.prototype.initItems = function(n) {
|
|
var data = this.sorter.generate(n);
|
|
var shuffled = this.sorter.shuffle(data);
|
|
var ordered = Object.create(shuffled);
|
|
ordered = this.sorter.sort(ordered, 0, ordered.length - 1);
|
|
|
|
// A swap on the dataset will not take effect until after transition is complete, so custom index is required.
|
|
var n = 0;
|
|
for (var i in shuffled) {
|
|
shuffled[i].index = n++;
|
|
}
|
|
|
|
// Items
|
|
this.groups = this.svg.selectAll('g').data(shuffled).enter().append('g')
|
|
.attr('transform', `translate(0, ${Visualizer.itemY})`);
|
|
|
|
this.groups.append('rect')
|
|
.attr('class', 'item')
|
|
.attr('height', Visualizer.itemH)
|
|
.attr('width', Visualizer.itemW)
|
|
.attr('fill', function doFill(d) { return d.fill; });
|
|
|
|
this.groups.transition(500)
|
|
.attr('transform', function doTransform(d, i) {
|
|
return `translate(${i * (Visualizer.itemW + Visualizer.spacerW)}, ${Visualizer.itemY})`;
|
|
});
|
|
|
|
// Item labels
|
|
this.groups.append('text')
|
|
.text(function t(d) { return d.value; })
|
|
.attr('fill', '#aaa')
|
|
.attr('font-size', 10)
|
|
.attr('font-family', 'sans-serif')
|
|
.attr('transform', function doTransform(d) {
|
|
return `rotate(90 0,0), translate(5, -3)`;
|
|
});
|
|
|
|
// Markers
|
|
var m1 = this.svg.append('g')
|
|
.attr('class', 'marker')
|
|
.attr('id', 'marker1');
|
|
|
|
m1.append('rect')
|
|
.attr('height', Visualizer.itemW)
|
|
.attr('width', Visualizer.itemW);
|
|
|
|
m1.append('text')
|
|
.attr('text-anchor', 'middle')
|
|
.attr('x', (Visualizer.itemW / 2))
|
|
.attr('y', 10);
|
|
|
|
var m2 = this.svg.append('g')
|
|
//temp
|
|
.attr('transform', 'translate(19,0)')
|
|
//temp
|
|
.attr('class', 'marker')
|
|
.attr('id', 'marker2');
|
|
|
|
m2.append('rect')
|
|
.attr('height', Visualizer.itemW)
|
|
.attr('width', Visualizer.itemW);
|
|
|
|
m2.append('text')
|
|
.attr('text-anchor', 'middle')
|
|
.attr('x', (Visualizer.itemW / 2))
|
|
.attr('y', 10);
|
|
|
|
setTimeout(this.followInstruction.bind(this, 0), 500);
|
|
};
|
|
|
|
/**
|
|
*
|
|
*/
|
|
Visualizer.prototype.initMessages = function() {
|
|
var container = document.createElement('div');
|
|
container.className = 'message-container';
|
|
|
|
var div1 = document.createElement('div');
|
|
div1.className = 'message';
|
|
|
|
var div2 = document.createElement('div');
|
|
div2.className = 'message';
|
|
|
|
var div3 = document.createElement('div');
|
|
div3.className = 'message';
|
|
|
|
container.appendChild(div1);
|
|
container.appendChild(div2);
|
|
container.appendChild(div3);
|
|
|
|
return container;
|
|
};
|
|
|
|
/**
|
|
*
|
|
*/
|
|
Visualizer.prototype.initRange = function() {
|
|
var rangeInput = function(label, event) {
|
|
label.innerHTML = 'Number of items (n) = ' + event.target.value;
|
|
};
|
|
|
|
var rangeChange = function(event) {
|
|
this.init.items(event.target.value);
|
|
};
|
|
|
|
|
|
var container = document.createElement('div');
|
|
container.className = 'range-container';
|
|
|
|
var msg = document.createElement('div');
|
|
msg.className = 'msg';
|
|
msg.innerHTML = "Number of items (n) = 10";
|
|
|
|
var range = document.createElement('input');
|
|
range.setAttribute('type', 'range');
|
|
range.setAttribute('value', 40);
|
|
range.setAttribute('min', 5);
|
|
range.setAttribute('max', 80);
|
|
range.addEventListener('change', rangeChange.bind(this));
|
|
range.addEventListener('input', rangeInput.bind(null, msg));
|
|
|
|
container.appendChild(range);
|
|
container.appendChild(msg);
|
|
|
|
return container;
|
|
},
|
|
|
|
/**
|
|
*
|
|
*/
|
|
Visualizer.prototype.initControls = function() {
|
|
var play = document.createElement('button');
|
|
play.className = 'fa fa-play';
|
|
play.title = 'Play'
|
|
play.addEventListener('click', onclick);
|
|
|
|
var back = document.createElement('button');
|
|
back.className = 'fa fa-step-backward';
|
|
back.title = 'Step Backward';
|
|
back.addEventListener('click', onclick);
|
|
|
|
var forward = document.createElement('button');
|
|
forward.className = 'fa fa-step-forward'
|
|
forward.title = 'Step Forward';
|
|
forward.addEventListener('click', onclick);
|
|
|
|
var reset = document.createElement('button');
|
|
reset.className = 'fa fa-fast-backward';
|
|
reset.title = 'Restart'
|
|
reset.addEventListener('click', onclick);
|
|
|
|
var stat1 = document.createElement('div');
|
|
stat1.className = 'stat';
|
|
stat1.innerHTML = 'Swaps: 999';
|
|
|
|
var stat2 = document.createElement('div');
|
|
stat2.className = 'stat';
|
|
stat2.innerHTML = 'Comparisons: 999';
|
|
|
|
var container = document.createElement('div');
|
|
container.className = 'controls-container';
|
|
|
|
container.appendChild(reset);
|
|
container.appendChild(back);
|
|
container.appendChild(play);
|
|
container.appendChild(forward);
|
|
container.appendChild(stat1);
|
|
container.appendChild(stat2);
|
|
|
|
return container;
|
|
};
|
|
|