【发布时间】:2017-04-05 16:38:01
【问题描述】:
我正在尝试制作某种动画,以便用户可以理解或查看为点集寻找凸包所采取的步骤。例如,假设我在 Graham Scan 中使用下面的代码,有哪些方法可以为行添加和删除设置动画?即使是很多点,也需要时间来处理,然后几乎立即将它们全部绘制出来,我不确定如何帮助用户体验正在发生的事情......
function GrahamScan(points) {
points.sort(function(a, b){return a.x - b.x})
var stack1 = [];
var stack2 = [];
stack1.push(points[0])
stack1.push(points[1])
for (i=2; i < points.length; i++) {
len = stack1.length > 1;
turn = RTT(stack1[stack1.length-2], stack1[stack1.length-1], points[i]) === 1;
ctx.beginPath();
ctx.moveTo(stack1[stack1.length-2].x,stack1[stack1.length-2].y);
ctx.lineTo(stack1[stack1.length-1].x,stack1[stack1.length-1].y);
ctx.stroke();
while (len && !turn) {
stack1.pop();
reDraw(points, stack1, stack2);
len = stack1.length > 1;
if (!len) {
break
}
turn = RTT(stack1[stack1.length-2], stack1[stack1.length-1], points[i]) === 1;
}
stack1.push(points[i]);
}
ctx.beginPath();
ctx.moveTo(stack1[stack1.length-2].x,stack1[stack1.length-2].y);
ctx.lineTo(stack1[stack1.length-1].x,stack1[stack1.length-1].y);
ctx.stroke();
stack2 = [];
stack2.push(points[points.length-1])
stack2.push(points[points.length-2])
for (i=2; i < points.length; i++) {
len = stack2.length > 1;
turn = RTT(stack2[stack2.length-2], stack2[stack2.length-1], points[points.length-i-1]) === 1;
ctx.beginPath();
ctx.moveTo(stack2[stack2.length-2].x,stack2[stack2.length-2].y);
ctx.lineTo(stack2[stack2.length-1].x,stack2[stack2.length-1].y);
ctx.stroke();
while (len && !turn) {
stack2.pop();
reDraw(points, stack1, stack2);
len = stack2.length > 1;
if (!len) {
break
}
turn = RTT(stack2[stack2.length-2], stack2[stack2.length-1], points[points.length-i-1]) === 1;
}
stack2.push(points[points.length-i-1]);
}
ctx.beginPath();
ctx.moveTo(stack2[stack2.length-2].x,stack2[stack2.length-2].y);
ctx.lineTo(stack2[stack2.length-1].x,stack2[stack2.length-1].y);
ctx.stroke();
}
function reDraw(points,stack1,stack2) {
ctx.clearRect(0, 0, w, h);
document.getElementById("canvasimg").style.display = "none";
for (j = 0; j < points.length; j++) {
ctx.beginPath();
ctx.fillStyle = x;
ctx.fillRect(points[j].x-1, points[j].y-1, 3, 3);
ctx.closePath();
}
for (k = 1; k < stack1.length; k++) {
ctx.beginPath();
ctx.moveTo(stack1[k-1].x-1,stack1[k-1].y-1);
ctx.lineTo(stack1[k].x-1,stack1[k].y-1);
ctx.stroke();
}
for (l = 1; l < stack2.length; l++) {
ctx.beginPath();
ctx.moveTo(stack2[l-1].x-1,stack2[l-1].y-1);
ctx.lineTo(stack2[l].x-1,stack2[l].y-1);
ctx.stroke();
}
}
function RTT(a, b, c) {
return Math.sign((b.x - a.x)*(c.y-a.y) - (b.y-a.y)*(c.x-a.x));
}
【问题讨论】:
-
不确定是否得到您的要求,但有一个滴答点:如果您只有一种笔触样式,您可以创建一个路径并只调用一次笔触,如果您这样做,这将大大提高性能有很多行。
标签: javascript animation canvas geometry convex-hull