先上图

当要填充图形时,必须区分开哪些部分是覆盖的,哪些是空的,根据绘制的方向可以判断出来

非零环绕规则:对于路径中指定范围区域,从该区域内部画一条足够长的线段,使此线段的完全落在路径范围之外。

非零环绕规则计数器:
然后,将计数器初始化为0,每当这个线段与路径上的直线或曲线相交时,就改变计数器的值,如果是与路径顺时针相交时,那么计数器就加1, 如果是与路径逆时针相交时,那么计数器就减1.
如果计数器始终不为0,那么此区域就在路径范围里面,在调用fill()方法时,浏览器就会对其进行填充。如果最终值是0,那么此区域就不在路径范围内,浏览器就不会对其进行填充。

如图
线段1:根据非零环绕规则,这条直线只经过路径一次且路径是逆时针方向,那么计数器为-1;

根据浏览器对计数器的计算原理得出,当调用fill()方法时浏览器会填充此区域。

线段2:根据非零环绕规则,这条直线经过路径二次且路径都是逆时针方向,那么计数器为-2;

根据浏览器对计数器的计算原理得出,当调用fill()方法时浏览器会填充此区域。

线段3:根据非零环绕规则,这条直线经过路径二次;第一次经过的路径是逆时针方向,计数器则为-1;

第二次经过的路径是顺时针方向,计数器为1;原因计数器的最终值为0-1+1 = 0;

所以根据浏览器对计数器的计算原理得出,当调用fill()方法时浏览器不会填充此区域。

最新文章

  1. PHP加密技术
  2. 二叉树建立,遍历和二叉排序树的判断【c++】
  3. 大学站防SQL注入代码(ASP版)
  4. JSP动作标签
  5. JAVA WEB 的JSP(9*9乘法表+*型金字塔)
  6. Ubuntu下面安装eclipse for c++
  7. samba服务器源码安装(非rpm)
  8. 编码规范(一)之Code Templates的设置(转)
  9. Java Concurrency - Lock
  10. ModelState用法
  11. Android手机USB调试安全闲扯(315晚会免费充电桩事件)
  12. filebeat-6.4.3-windows-x86_64输出Kafka
  13. 初识服务发现及Consul框架的简单使用
  14. git图解
  15. Semantic Versioning Specification & 语义化版本
  16. 使用Ajax方式POST JSON数据包(转)
  17. Json转换工具类(基于google的Gson和阿里的fastjson)
  18. Spring Boot 2 实践记录之 组合注解原理
  19. ThinkPHP与EasyUI整合之三(searchbox):在datagrid中查询指定记录
  20. Android Studio配置及使用OpenCV

热门文章

  1. python之Django学习笔记(二)---Django从工程创建、app创建到表建模在页面的显示
  2. 【JMeter】(3)---MySQL压测
  3. Zabbix系列之八——安装agent监控windows
  4. qt 共享内存 单例
  5. 《深入理解Java虚拟机》-----第2章 Java内存区域与内存溢出异常
  6. 关于mybatis中typeHandler的两个案例
  7. 第22章 使用外部身份提供商登录 - Identity Server 4 中文文档(v1.0.0)
  8. MySQL 笔记整理(6) --全局锁和表锁:给表加个字段怎么有这么多阻碍
  9. Nunit的尝试
  10. 学JAVA第六天,运算符、表达式、if语句以及for、while、都循环