我正在尝试创建自己的基本排序算法可视化工具。尝试交换数组中的两个数字时遇到问题。作为该过程的一部分,我需要交换函数来交换图表上的视觉线。
我已经用 Python 编写了这个,我正在尝试用 javascript 重写它。这是它在 Python 中按预期工作的 gif:https ://i.imgur.com/IVWuZ2o.gifv
我的问题是,当我想交换两个值时,原始行没有被清除,而是用新行绘制。这是尝试洗牌后最终的样子:
这是代码:
function eraseLine(a, i) {
ctx.clearRect(i * lineWidth, height - a[i], lineWidth, a[i]);
}
function swap(a, i, j) {
// clear the lines already there
lineWidth = width / a.length;
ctx.lineWidth = lineWidth;
eraseLine(a, i);
eraseLine(a, j);
// actually swap the values
var temp = a[i];
a[i] = a[j];
a[j] = temp;
// redraw the new lines
ctx.strokeStyle = "#FFFFFF";
ctx.moveTo(i * lineWidth + lineWidth / 2, height);
ctx.lineTo(i * lineWidth + lineWidth / 2, height - a[i]);
ctx.stroke();
ctx.moveTo(j * lineWidth + lineWidth / 2, height);
ctx.lineTo(j * lineWidth + lineWidth / 2, height - a[j]);
ctx.stroke();
}
async function eraseLines(a, start, end) {
for(var i = start; i < end; i++) {
eraseLine(a, i);
await sleep(50);
}
}
async function shuffle(a) {
for(var i = a.length - 1; i > 0; i--) {
var j = Math.floor(Math.random() * (i + 1));
swap(a, i, j);
await sleep(50);
}
}