非零环绕原则

非零环绕原则

​ canvas绘图中交叉路径的填充问题,依据非零环绕原则,由顺、逆时针穿插次数决定是否填充某一区域

1.非零环绕原则原理

​ 判断有自我交叉情况的路径时,对于路径中的任意给定区域,从该区域内部画一条足够长的线段,使此线段的终点完全落在路径范围之外。然后,初始化计数器为0,每当这条线段与路径上的直线或曲线相交时,就改变计数器的值。如果是与路径的顺时针部分相交,则加1,如果是与路径的逆时针部分相交,则减1。若计数器的最终值不是0,那么此区域就在路径里面,在调用fill方法时,浏览器就会对其进行填充。如果最终值时0,那么此区域就不在路径内部,浏览器就不会对其进行填充

这里写图片描述

2.应用实例

​ 绘制镂空矩形,内部矩形和外部矩形绘制路径方向相反,内部矩形不会填充

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
  <style>
    canvas {
      border: 1px solid #000;
    }
  </style>
</head>
<body>
<canvas width="600" height="400" id='cas'></canvas>

<script>
  // 获取元素
  var cas = document.getElementById( "cas" );
  // 获取绘图上下文
  var ctx = cas.getContext( '2d' );

  // 绘制镂空矩形
  // 里面顺时针, 外面逆时针就可以实现

  // 外部方形 逆时针
  ctx.moveTo( 100, 100 )
  ctx.lineTo( 100, 300 )
  ctx.lineTo( 300, 300 )
  ctx.lineTo( 300, 100 )
  ctx.closePath();

  // 内部方形 顺时针
  ctx.moveTo( 150, 150 );
  ctx.lineTo( 250, 150 );
  ctx.lineTo( 250, 250 );
  ctx.lineTo( 150, 250 );
  ctx.closePath();

  ctx.fill();

</script>
</body>
</html>

代码及相关文件详见GitHub主页 绘制镂空矩形-非零环绕原则

https://github.com/Jianxq12/ITcast/tree/master/Canvas

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值