【问题标题】:How to create nxm HTML5 canvas Grid of objects (colored squares)?如何创建对象的 nxm HTML5 画布网格(彩色方块)?
【发布时间】:2014-11-01 03:05:58
【问题描述】:

我正在尝试在给定区域<canvas> 中创建一个包含 n 列和 m 行的正方形网格(矩阵),如果需要,还可以选择设置正方形之间的间距。网格应该用随机颜色填充正方形。

我还想添加一个缩放功能,这样彩色方块在双击的区域会显得更大。

谁能提出一个生成网格并为正方形分配随机颜色的好方法?如果您也可以建议如何创建缩放效果,那将是 SUPER :)

我是画布新手,所以任何方法帮助都会很棒! 谢谢

【问题讨论】:

  • 你真的尝试过什么吗?
  • 还没Zeke,我想先问问方法的想法。如果我能找到听起来合理的方法,我会尝试的。一直在尝试可能会浪费很多时间。
  • 生成一个正方形对象的二维数组怎么样?绘图将迭代认为数组根据它们在数组中的位置定位元素。对于随机颜色,使用Math.random() 生成随机RGB 值(从0255)。
  • 听起来很合理,斯宾塞。我想我可以为列创建一个循环,并在其中为行创建另一个循环,并以这种方式填充网格。
  • 一旦我有一个 10px x 10px 的正方形网格,我将如何处理缩放?画布是否具有某种透视或相机功能?

标签: javascript css html math canvas


【解决方案1】:

从您@Spencer Wieczorek 的 cmets 看来,填充单元格的绘图已经完成。

问题的另一部分的关键是使用转换:

  • 确定要缩放的点(双击):var scalePtX,scalePtY

  • 保存未转换的上下文状态:ctx.save();

  • 按 (1-zoom)*scalePoint 翻译:ctx.translate((1-zoom)*scalePtX,(1-zoom)*scalePtY)

  • 缩放比例:ctx.scale(zoom,zoom)

  • 使用坐标绘制单元格,就像它们未转换一样:fillRect

  • 将上下文恢复到未转换的状态:ctx.restore()

这是重要的代码和演示:http://jsfiddle.net/m1erickson/e8bfg3h4/

function draw(){
    ctx.clearRect(0,0,cw,ch);
    ctx.save();
    ctx.translate((1-zoom)*scalePtX,(1-zoom)*scalePtY);
    ctx.scale(zoom,zoom);
    ctx.globalAlpha=0.25;
    for(var y=0;y<rows;y++){
    for(var x=0;x<cols;x++){
        ctx.fillStyle=colors[y*cols+x];
        ctx.fillRect(x*(w+padding),y*(h+padding),w,h);
    }}
    ctx.globalAlpha=1.00;
    ctx.beginPath();
    ctx.arc(scalePtX,scalePtY,10,0,Math.PI*2);
    ctx.closePath();
    ctx.stroke();
    ctx.restore();
}

【讨论】:

  • mark,谢谢你填补了我刚刚经历的所有漏洞:)。很快就会实现你的代码,看看它是如何运行的。感谢您如此详细的回复。
  • 我试图增加您的代码的一部分 - 处理缩放的部分,但我无法解释您的 handleMouseDown(e) 函数。为什么你在这个函数中加入了'e'对象?这让我有点困惑。
  • 已经回答了我自己的问题...stackoverflow.com/questions/3535996/…
  • @sidewaiise 正如您所发现的,鼠标处理程序中的e 包含一个事件对象。该事件对象的 clientX 和 clientY 属性保存鼠标的当前位置。干杯!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-25
  • 1970-01-01
  • 2016-07-28
  • 1970-01-01
  • 2020-01-12
相关资源
最近更新 更多