canvas画田字格与米字格

项目中最近用到了canvas画图的功能,主要利用它来描绘字体,并描绘字体的笔划,动画实现。字体背景为田字格或米字格或图片,仅以田字格与米字格的画法小结供网友参考。 主要用到canvas的画路径与描边、遮罩绘制的功能。

<!DOCTYPE html>
<html>

	<head>
		<meta charset="utf-8">
		<title></title>
		<style type="text/css">
			#div1 {
				width: 400px;
				height: 400px;
			}
		</style>
	</head>

	<body>
		<div id="div1">
			<canvas width="800" height="800" id="cs">你的浏览器不支持canvas!</canvas>
		</div>

		<script type="text/javascript">
			var oCanvas = document.getElementById('cs');

			if (oCanvas.getContext) {
				var ctx = oCanvas.getContext('2d'),
					l = 0,
					w = oCanvas.width,
					half = w / 2,
					span = 5; //每条虚线的实线部分长度为5

				ctx.strokeStyle = '#FF0000';
				ctx.lineWidth = 2;
				ctx.strokeRect(1, 1, w - 2, w - 2);
				
				//依次调用看效果!
				//drawReal(ctx);
				//drawUnReal(ctx);
				//drawUnRealNB(ctx);
				drawSimpleUnreal(ctx);
			}

			 //画实线
			function drawReal(ctx) {
				ctx.save();
				ctx.lineWidth = 1;
				ctx.beginPath();

				//横线
				ctx.moveTo(0, half);
				ctx.lineTo(w, half);

				//竖线
				ctx.moveTo(half, 0);
				ctx.lineTo(half, w);

				//交叉线1
				ctx.moveTo(0, 0);
				ctx.lineTo(w, w);

				//交叉线2
				ctx.moveTo(0, w);
				ctx.lineTo(w, 0);

				ctx.stroke();
				ctx.closePath();
				ctx.restore();
			}

			 //画虚线,兼容性没问题!
			function drawUnReal(ctx) {
				ctx.save();
				ctx.lineWidth = 1;
				ctx.beginPath();
				ctx.moveTo(0, half);
				l = w / 5; //横线路径
				for (var i = 0; i < l; i += 2) {
					ctx.lineTo(i * span, half);
					ctx.moveTo((i + 1) * span, half);
				}

				//竖线路径
				ctx.moveTo(half, 0);
				for (var i = 0; i < l; i += 2) {
					ctx.lineTo(half, i * span);
					ctx.moveTo(half, (i + 1) * span);
				}

				ctx.translate(half, half);
				ctx.rotate(45 * Math.PI / 180);

				ctx.moveTo(0, -half * Math.SQRT2);

				l = Math.ceil(w * Math.SQRT2 / 5);

				//交叉线1
				for (var i = 0; i < l; i += 2) {
					ctx.lineTo(0, -half * Math.SQRT2 + i * span);
					ctx.moveTo(0, -half * Math.SQRT2 + (i + 1) * span);
				}

				ctx.rotate(90 * Math.PI / 180);
				ctx.moveTo(0, -half * Math.SQRT2);

				//交叉线2
				for (var i = 0; i < l; i += 2) {
					ctx.lineTo(0, -half * Math.SQRT2 + i * span);
					ctx.moveTo(0, -half * Math.SQRT2 + (i + 1) * span);
				}

				//统一描边节省性能!
				ctx.stroke();
				ctx.restore();
			}

			 //画虚线——掏窟窿作法
			function drawUnRealNB(ctx) {
				drawReal(ctx);
				
				//画窟窿
				ctx.save();
				ctx.lineWidth = 1;
				ctx.beginPath();
				l = w / 5; //横线路径
				for (var i = 1; i < l; i += 2) {
					ctx.rect(i*span,half-2,span,3);
				}

				//竖线路径
				for (var i = 1; i < l; i += 2) {
					ctx.rect(half-2,i*span,3,span);
				}

				ctx.translate(half, half);
				ctx.rotate(45 * Math.PI / 180);

				l = Math.ceil(w * Math.SQRT2 / 5);

				//交叉线1
				for (var i = 1; i < l; i += 2) {
					ctx.rect(-2,-half * Math.SQRT2+i*span,3,span);
				}

				ctx.rotate(90 * Math.PI / 180);

				//交叉线2
				for (var i = 1; i < l; i += 2) {
					ctx.rect(-2,-half * Math.SQRT2+i*span,3,span);
				}
				ctx.restore();

				//进行掏窟窿
				ctx.clip();
				ctx.clearRect(0,0,w,w);				
			}
		
			//画虚线简单做法,有兼容性问题!
			function drawSimpleUnreal(ctx){
				ctx.save();
				ctx.lineWidth = 1;
				ctx.beginPath();
				
				//画布增强功能(注意兼容性,嵌入到ios safari4.3.3有问题!)http://msdn.microsoft.com/zh-cn/library/ie/dn265037(v=vs.85).aspx
				//IE11+/safari7+
				
				//ctx.setLineDash([12,3,3,3]); //创建12像素长,间隔为3像素 + 3像素长,间隔为3像素的点划线
				ctx.setLineDash([5,5]); //创建5像素长,间隔为5像素的虚线

				//横线
				ctx.moveTo(0, half);
				ctx.lineTo(w, half);

				//竖线
				ctx.moveTo(half, 0);
				ctx.lineTo(half, w);

				//交叉线1
				ctx.moveTo(0, 0);
				ctx.lineTo(w, w);

				//交叉线2
				ctx.moveTo(0, w);
				ctx.lineTo(w, 0);

				ctx.stroke();
				ctx.closePath();
				ctx.restore();
			}
		</script>
	</body>

</html>


  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用 canvas 在浏览器中出毛笔。你可以使用 canvas 的绘图方法来出毛笔的形状,例如 `moveTo` 和 `lineTo`。还可以使用 canvas 的样式属性来控制毛笔的颜色和粗细。 下面是一个简单的例子,使用 canvas 出一个毛笔 "你好"。 ``` <canvas id="canvas"></canvas> <script> // 获取 canvas 元素 var canvas = document.getElementById('canvas'); // 获取 canvas 的绘图上下文 var ctx = canvas.getContext('2d'); // 设置毛笔的样式 ctx.strokeStyle = 'black'; ctx.lineWidth = 2; // 开始绘制 "你" ctx.beginPath(); ctx.moveTo(20, 20); ctx.lineTo(80, 20); ctx.moveTo(50, 20); ctx.lineTo(50, 80); ctx.stroke(); // 开始绘制 "好" ctx.beginPath(); ctx.moveTo(100, 20); ctx.lineTo(100, 80); ctx.lineTo(160, 80); ctx.moveTo(130, 20); ctx.lineTo(130, 50); ctx.lineTo(160, 50); ctx.stroke(); </script> ``` 在这个例子中,我们使用了 `moveTo` 和 `lineTo` 方法来绘制毛笔的每一条线段。然后使用 `strokeStyle` 和 `lineWidth` 属性来设置毛笔的颜色和粗细。最后使用 `stroke` 方法来描绘毛笔的轮廓。 希望这个例子能帮助你开始使用 canvas 出毛笔。 ### 回答2: 要在 canvas毛笔,首先需要了解毛笔的特点和基本步骤。 1. 准备好 canvas 和相关的绘图工具,如笔和颜料。 2. 在 canvas 上创建一个绘图区域,可以是整个布或者指定的区域。 3. 根据毛笔的特点,毛笔的粗细变化是重要的表现手法。因此,在绘制毛笔之前,要先确定好毛笔的笔粗细和变化规律。 4. 使用毛笔蘸取适量的颜料,开始绘制毛笔。可以先用干净的水调试颜料的浓稀程度,以获得所需的效果。 5. 在 canvas 上运用毛笔技巧,如横竖撇捺等,按照的结构和笔顺序进行绘制。要注意手腕的灵活运动,控制好笔的方向和大小。 6. 在毛笔的过程中,可以通过调整绘图工具的压力、倾斜度等来模拟毛笔的特性,进一步丰富形的纹理和灵动感。 7. 在绘制毛笔的同时,注意控制速度和力度,以保持毛笔的稳定性和力度变化的连续性。 8. 可以尝试不同的绘制技巧和风格,如运用水墨渲染、点和线的组合,进一步丰富和美化毛笔的表现效果。 在绘制完成后,可以对毛笔进行修饰、添置背景等,以增强视觉效果。最后,记得保存和分享你的毛笔作品。绘制毛笔需要一定的技巧和经验,不断的实践和尝试会使你的绘水平不断提高。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值