【问题标题】:Draw a circle filled with random color sqares on canvas在画布上绘制一个充满随机颜色方块的圆圈
【发布时间】:2014-04-09 20:34:03
【问题描述】:

我有一个很奇怪的例子要处理... 我需要用 1x1 像素填充一个圆圈,在浏览器中使用不同的颜色。

我试过的,是这样的

function getRandomColor() {
    var letters = '0123456789ABCDEF'.split('');
    var color = '#';
    for (var i = 0; i < 6; i++ ) {
        color += letters[Math.round(Math.random() * 15)];
    }
    return color;
}

function createRandomSqaure(destination) {
    var size = destination.height() * destination.width();

    for (var i = 0; i < size; i += 1) {
        destination.append('<div class="pixel" style="background: ' + getRandomColor() + '"></div>');
    }
}

createRandomSqaure($('.pic'));

情况是,它超级慢(您可以想象,对于 200x200 图像,循环进行 40k 次),我认为也许更好的方法是在画布上绘制它? 最后我需要画一个用这个像素填充的圆圈......

我不知道如何以更优化的方式做这样的事情,我也可以使用 nodejs 服务器,但我认为在 heroku 上生成类似这样的服务器端的东西太多了。

我只是好奇你们怎么看,做这种事情的最好方法是什么?

【问题讨论】:

    标签: javascript html loops canvas html5-canvas


    【解决方案1】:

    您可以使用这样的简单方法:

    • 在画布上的 200x200 网格中用随机颜色绘制所有像素
    • 更改复合模式
    • 在顶部画圆

    Live demo

    结果:

    示例:

    var canvas = document.getElementById('canvas'), // get canvas element
        ctx = canvas.getContext('2d'),              // get context
        x, y = 0,                                   // initialize
        dia = canvas.width,
        radius = dia * 0.5;
    
    ctx.translate(0.5, 0.5);                        // to make pixels sharper
    
    for(; y < dia; y++) {                           // walk x/y grid
        for(x = 0; x < dia; x++) {
            ctx.fillStyle = getRndColor();          // set random color
            ctx.fillRect(x, y, 1, 1);               // draw a pixel
        }
    }
    
    // create circle
    
    // removes pixels outside next shape
    ctx.globalCompositeOperation = 'destination-in'; 
    ctx.arc(radius, radius, radius, 0, 2*Math.PI);
    ctx.fill();
    
    // reset
    ctx.globalCompositeOperation = 'source-over'; 
    
    function getRndColor() {
        var r = 255*Math.random()|0,
            g = 255*Math.random()|0,
            b = 255*Math.random()|0;
        return 'rgb(' + r + ',' + g + ',' + b + ')';
    }
    

    【讨论】:

    • 用更好的解决方案打败我。要走的路:D
    【解决方案2】:

    我会为此使用画布,因为使用实际的 DOM 元素会增加大量开销。

    function drawRect(x,y) {
        var c=document.getElementById("myCanvas");
        var ctx=c.getContext("2d");
        ctx.rect(x,y,1,1);
        ctx.strokeStyle = getRandomColor();
        ctx.stroke();
    }
    

    它仍然会很糟糕,但无论如何它都很糟糕,除非你有一个服务器预先生成图像或其他东西,这样客户端就不会被束缚。

    【讨论】:

      【解决方案3】:

      当然,添加 40000 个 div 非常慢,应始终避免。像这样的技巧以旧方式用于在 div 上获得动态圆角,它使页面变得非常慢。

      所以是的,你应该使用画布。顺便说一句,您可以优化获得随机颜色的方式:

      var r = Math.floor(Math.Random()* 256);
      var g = Math.floor(Math.Random()* 256);
      var b = Math.floor(Math.Random()* 256);
      
      var cssColor = 'rgb(' + r +', ' + g + ',' + b +')';
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-02
        • 2017-12-15
        • 2013-10-24
        • 2012-11-21
        • 2016-10-10
        • 2013-09-20
        相关资源
        最近更新 更多