首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >困惑于globalCompositeOperation

困惑于globalCompositeOperation
EN

Stack Overflow用户
提问于 2015-10-07 04:19:51
回答 1查看 89关注 0票数 3

我试图为Sierpinski地毯的最初几次迭代编写一个简单的演示,如下所示:

我想要进行的方式是单击以更小的比例应用基本模式掩码,每一步。在我看来,从一个黑色的正方形开始,然后使用一个“目的地-in”的globalCompositeOperation和一个源掩码,就像第二张图像一样,我应该能够做我想做的事情,但我很难把它组合起来。

这绘制了背景黑方块:

代码语言:javascript
复制
context.globalCompositeOperation = "source-over";
context.fillStyle = 'black';
context.fillRect(0, 0, 500, 500);

然后,我希望像下面这样的代码会产生第一步。但结果却是一片空白。

代码语言:javascript
复制
context.globalCompositeOperation = "destination-in";
var mask = [1, 1, 1, 1, 0, 1, 1, 1, 1];
for (var m = 0; m < 9; ++m)
{
    var x = 10 + m % 3 * 150;
    var y = 10 + Math.floor(m / 3) * 150;
    if (mask[m] > 0)
    {
        context.fillRect(x, y, 150, 150);
    }
}

为了向大家展示这个问题,我在http://jsfiddle.net/128gxxmy/4/上做了个摆弄。

这似乎并不是一件困难的事情,所以我显然误解了一些重要的东西,并且会感激任何建议。

谢谢。

编辑:当然!我知道为什么它是空白的。第一个填充区域清除除左上角以外的所有区域,而下一个则清除掉该区域。我需要使用rect(.)然后一次填()。如果我重新加工它,在一个步骤中画每一遍,它应该能做到这一点。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-07 11:20:04

为了完整,万一其他人落入相同的陷阱,下面是相关代码。最后,我使用了一个临时的(不可见的)画布,画了一个完整的层,只有一个填充。

代码语言:javascript
复制
function drawLevel(k, fill, mask)
{
    tempContext.save();
    tempContext.clearRect(0, 0, canvas.width, canvas.height);

    // current canvas is destination
    tempContext.drawImage(canvas, 0, 0);
    // set global composite
    tempContext.globalCompositeOperation = "destination-in";

    // draw source
    tempContext.beginPath();

    // how many squares each row
    var n = Math.pow(3, k);

    var size = 450 / n / 3;
    for (var i = 0; i < n; ++i)
        for (var j = 0; j < n; ++j)
        {
            for (var m = 0; m < 9; ++m)
            {
                var x = 10 + i * size + m % 3 * size;
                var y = 10 + j * size + Math.floor(m / 3) * size;
                if (mask[m] > 0)
                {
                    tempContext.rect(x, y, size, size);
                }
            }
        }

    tempContext.fillStyle = fill;
    tempContext.fill();
    tempContext.restore();

    // copy drawing from tempCanvas onto visible canvas
    context.drawImage(tempCanvas, 0, 0);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32983754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档