Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在HTML5画布上同时跟踪两条路径_Javascript_Html_Canvas_Optimization - Fatal编程技术网

Javascript 在HTML5画布上同时跟踪两条路径

Javascript 在HTML5画布上同时跟踪两条路径,javascript,html,canvas,optimization,Javascript,Html,Canvas,Optimization,我的代码在精神上与这段代码相当: function drawComplicatedThing(ctx) { let [px, py] = [0, 0]; for (let i = 0; i < 10000; i++) { let {x, y} = computeExpensive(i); // black along ctx.beginPath(); ctx.moveTo(px, py); c

我的代码在精神上与这段代码相当:

function drawComplicatedThing(ctx) {
    let [px, py] = [0, 0];
    for (let i = 0; i < 10000; i++) {
        let {x, y} = computeExpensive(i);

        // black along
        ctx.beginPath();
        ctx.moveTo(px, py);
        ctx.lineTo(x, y);
        ctx.strokeStyle = 'black';
        ctx.stroke();

        // red transpose
        ctx.beginPath();
        ctx.moveTo(py, px);
        ctx.lineTo(y, x);
        ctx.strokeStyle = 'red';
        ctx.stroke();

        [px, py] = [x, y];
    }
}

HTML5中是否存在这种功能,或者我是否需要围绕一次只能跟踪一条笔划路径来构建代码?

您可以尝试调用第二个
getContext
,但即使它起作用,也可以更清楚地将要渲染的点存储到数组中,然后将其传递两次。@JanDvorak。每个画布只有一个上下文,因此多个
getContext
调用始终获得相同且唯一的上下文。您关于缓存昂贵的积分的建议听起来是正确的答案。:-)我怀疑JanDvorak有你的答案,但你可以用两张画布(一张画黑线,一张画红线)并将它们与:
blackContext.drawImage(redCanvas,0,0)
@JanDvorak我在问之前确实试过了。这两个结果相互之间是
==
,所以它只是指同一个上下文。@标记如果将它们放在一起,你甚至不需要将它们组合在一起(顺便提一下,这是一个有趣的想法;我可以自己尝试一下)
function drawComplicatedThing(ctx) {
    // black along
    ctx.moveTo(0, 0);
    for (let i = 0; i < 10000; i++) {
        let {x, y} = computeExpensive(i);
        ctx.lineTo(x, y);
    }
    ctx.strokeStyle = 'black';
    ctx.stroke();

    // red transpose
    ctx.moveTo(0, 0);
    for (let i = 0; i < 10000; i++) {
        let {x, y} = computeExpensive(i);
        ctx.lineTo(y, x);
    }
    ctx.strokeStyle = 'red';
    ctx.stroke();
}
function drawComplicatedThing(ctx) {
    let ctx2 = ctx.independentCopy(); // <-- NOT REAL, but you get the idea
    ctx.moveTo(0, 0);
    ctx2.moveTo(0, 0);
    for (let i = 0; i < 10000; i++) {
        let {x, y} = computeExpensive(i);
        ctx.lineTo(x, y);
        ctx2.lineTo(y, x);
    }
    ctx.strokeStyle = 'black';
    ctx.stroke();
    ctx2.strokeStyle = 'red';
    ctx2.stroke();
}