【问题标题】:HTML5 Canvas Checkered PatternHTML5 帆布方格图案
【发布时间】:2021-04-21 13:35:13
【问题描述】:

我正在尝试创建复古的像素化背景画。 “像素”的 x 和 y 位置相应地是奇数和偶数。这似乎适用于 4 的分辨率(res 变量),然后 % 运算符似乎不起作用。

function drawPixelatedBackground()
{
    var res = 5;

    for (var x=0; x<settings.width/res;x++ )
    { 
        for (var y=0;y<settings.height/res;y++)
        {
            if ( (x%2==0) && (y%2==0) )
            {
                nx = x * (settings.width/res);
                ny = y * (settings.width/res);
                ctx.fillStyle= settings.colors.Fill;
                ctx.fillRect(nx,ny, nx+  (settings.width/res),ny+   (settings.height/res) );
            }

        }
    }
}

【问题讨论】:

  • 给你。你可以在这里看到的模式很好,我同意。但我想要的只是矩阵棋盘风格。 jsfiddle.net/zwuLcntj

标签: javascript canvas html5-canvas


【解决方案1】:

你的逻辑有点问题。我会在下面解释我的。

http://jsfiddle.net/2eee9moq/2/

function drawCheckeredBackground(can, nRow, nCol) {
    var ctx = can.getContext("2d");
    var w = can.width;
    var h = can.height;

    nRow = nRow || 8;    // default number of rows
    nCol = nCol || 8;    // default number of columns

    w /= nCol;            // width of a block
    h /= nRow;            // height of a block

    for (var i = 0; i < nRow; ++i) {
        for (var j = 0, col = nCol / 2; j < col; ++j) {
            ctx.rect(2 * j * w + (i % 2 ? 0 : w), i * h, w, h);
        }
    }

    ctx.fill();
}

var canvas = document.getElementById("canvas");

drawCheckeredBackground(canvas);
&lt;canvas id="canvas" width="300" height="300"&gt;&lt;/canvas&gt;
  • 嵌套的for 循环将块绘制成一行。
    • 2 * j * w + (i % 2 ? 0 : w) 每隔一行移动每个块的 x 坐标。

【讨论】:

  • 非常漂亮,流畅和聪明。谢谢。竖起大拇指。我将保留其他功能来创建波斯 Teppich :)
【解决方案2】:

像这样遍历行和列:

for (let column = 0; column < board.columns; column++) {
  for (let row = 0; row < board.rows; row++) {

  }
}

如果满足以下任一条件,则通过绘制矩形创建方格图案:

  • 行偶数列奇数
  • 行奇数列偶数

在代码中:

if (row % 2 === 0 && column % 2 === 1 || row % 2 === 1 && column % 2 === 0) {
  canvas.context.rect(
    column * column_width,
    row * row_height,
    column_width,
    row_height
  );
}

const canvas = {
  element: document.querySelector("canvas"),
  context: document.querySelector("canvas").getContext('2d')
}

const board = {
  rows: 15,
  columns: 17,
  colors: {
    light: '#a3cf53',
    dark: '#abd55a'
  }
}

canvas.context.beginPath();
canvas.context.fillStyle = board.colors.dark;
canvas.context.rect(0, 0, canvas.element.width, canvas.element.height);
canvas.context.fill();

canvas.context.beginPath();
canvas.context.fillStyle = board.colors.light;
for (let column = 0; column < board.columns; column++) {
  for (let row = 0; row < board.rows; row++) {
    if (row % 2 === 0 && column % 2 === 1 || row % 2 === 1 && column % 2 === 0) {
      canvas.context.rect(
        column * canvas.element.width / board.columns,
        row * canvas.element.height / board.rows,
        canvas.element.width / board.columns,
        canvas.element.height / board.rows
      );
    }
  }
}
canvas.context.fill();
body {
  margin: 0;
}
&lt;canvas width="595" height="525"&gt;&lt;/canvas&gt;

【讨论】:

    【解决方案3】:

    我们可以使用这样的事实来改变正方形的颜色,例如 (1,1), (2,2), (3,3),... 的对角线正方形将具有相同的颜色,例如白色和 ( 1,2), (2,3), (3,4),... 将是相同的颜色,比如黑色。我们注意到在(col, row) 中,如果colrow 都是偶数或都是奇数,那么正方形具有相同的颜色(白色),否则它们具有其他颜色(黑色)。

    代码逻辑:

    if ((i % 2 == 0 && j % 2 == 0) || (i % 2 != 0 && j % 2 != 0)){
        square is white/color1
    }
    else{
        square is black/color2
    }                   
         
    

    const board = document.getElementById("board")
    const ctx = board.getContext("2d")
    
    let cols = 8 
    let rows = 8
    let squareSize = 50
    
    function drawCheckeredBoard(ctx, squareSize, rows, cols) {
        let whiteSquareColor = "#ffe6cc"
        let blackSquareColor = "#cc6600"
    
        for (let j = 0; j < rows; j++)
            for (let i = 0; i < cols; i++) {
                if ((i % 2 == 0 && j % 2 == 0) || (i % 2 != 0 && j % 2 != 0)) 
                    ctx.fillStyle = whiteSquareColor
                else ctx.fillStyle = blackSquareColor
                ctx.fillRect(i * squareSize, j * squareSize, squareSize, squareSize)
            }
    }
    
    drawCheckeredBoard(ctx, squareSize, rows, cols)
    &lt;canvas id="board" width="400" height="400"&gt;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-27
      • 2018-11-15
      • 2012-06-04
      • 1970-01-01
      • 2017-08-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多