Canvas中的非零环绕规则原理

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

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

从上图中看
第一条线段:根据非零环绕规则,这条直线只经过路径一次且路径是逆时针方向,那么计数器为-1;根据浏览器对计数器的计算原理得出,当调用fill()方法时浏览器会填充此区域。

第二条线段:根据非零环绕规则,这条直线经过路径二次且路径都是逆时针方向,那么计数器为-2;根据浏览器对计数器的计算原理得出,当调用fill()方法时浏览器会填充此区域。

第三条线段:根据非零环绕规则,这条直线经过路径二次;第一次经过的路径是逆时针方向,计数器则为-1; 第二次经过的路径是顺时针方向,计数器为1;原因计数器的最终值为0-1+1 = 0;所以根据浏览器对计数器的计算原理得出,当调用fill()方法时浏览器不会填充此区域。

根据上面的原理,演示画一个环形图的实例

如下图:

实例代码:

<style type="text/css">
canvas {
	border:1px solid #e5e5e5;
}
</style>
<canvas id="firstCanvas" width="400" height="400"> Canvas not supported </canvas>

<script type="text/javascript">
var canvas  = document.getElementById("firstCanvas"),
    context = canvas.getContext && canvas.getContext("2d");

context.fillStyle = "#ff6600";

// clear current subPath
context.beginPath();
// outer circle
context.arc(200, 200, 100, 0, Math.PI * 2, true);
// inner circle
context.arc(200, 200, 50,  0, Math.PI * 2, false);
context.fill(); 

</script>
时间: 2024-10-27 11:14:38

Canvas中的非零环绕规则原理的相关文章

Canvas中的非零围绕规则原理

非零围绕规则:对于路径中指定范围区域,从该区域内部画一条足够长的线段.使此线段的全然落在路径范围之外. 非零围绕规则计数器:然后,将计数器初始化为0,每当这个线段与路径上的直线或曲线相交时,就改变计数器的值,假设是与路径顺时针相交时.那么计数器就加1, 假设是与路径逆时针相交时.那么计数器就减1.假设计数器始终不为0,那么此区域就在路径范围里面,在调用fill()方法时,浏览器就会对其进行填充.假设终于值是0,那么此区域就不在路径范围内,浏览器就不会对其进行填充. 从上图中看第一条线段:依据非零

Canvas中的非零环绕

先上图 当要填充图形时,必须区分开哪些部分是覆盖的,哪些是空的,根据绘制的方向可以判断出来 非零环绕规则:对于路径中指定范围区域,从该区域内部画一条足够长的线段,使此线段的完全落在路径范围之外. 非零环绕规则计数器:然后,将计数器初始化为0,每当这个线段与路径上的直线或曲线相交时,就改变计数器的值,如果是与路径顺时针相交时,那么计数器就加1, 如果是与路径逆时针相交时,那么计数器就减1.如果计数器始终不为0,那么此区域就在路径范围里面,在调用fill()方法时,浏览器就会对其进行填充.如果最终值

填充路径时所使用的 “非零环绕规则”

工作繁忙之际,抽了点时间看了下canvas,今天看到了“非零环绕规则”,抱着好奇的心里写了下书上的demo看了看效果,感觉还蛮实用的. 先简单说说“非零环绕规则”原理(基本摘自书本):如果绘图路径是循环的,或是包含多个相交的子路径,那么canvas的绘图环境变量就必须要判断,当fill()方法被调用时,应该如何对当前路径进行填充.canvas在填充那种互相有交叉路径时就会使用到“非零环绕规则”.“非零环绕规则是这么来判断自我交叉情况的路径的:对于路径中的任意给定的区域,从该区域内部画一条足够长的

填充路径时使用的非零环绕规则

如果当前路径是循环的,或者包含多个相交的子路径,那么Canvas的绘图环境变量就必须判断,当fill()方法被调用时,应该如何对当前路径进行填充. Canvas在填充互相有交叉的路径时,使用非零环绕规则 非零环绕 对于路径中的任意给定区域,从该区域内部画一条足够长的线段,使此线段的终点完全落在路径范围之外. 接下来将计数器初始化为0,然后,每当这条线段与路径上的直线或曲线相交时,就改变计算器的值.如果是与路径的顺时针部分相交,则加1,如果与路径的逆时针相交,则减1. 若计算器的最终值不是0,那么

非零缠绕规则和奇偶规则

在图形学中判断一个点是否在多边形内,若多边形不是自相交的,那么可以简单的判断这个点在多边形内部还是外部:若多边形是自相交的,那么就需要根据非零环绕数规则和奇-偶规则判断. 判断多边形是否是自相交的:多边形在平面内除顶点外还有其他公共点 内-外测试    不自交的多边形:多边形仅在顶点处连接,而在平面内没有其他公共点,此时可以直接划分内-外部分.    自相交的多边形:多边形在平面内除顶点外还有其他公共点,此时划分内-外部分需要采用以下的方法. (1)奇-偶规则(Odd-even Rule):奇数

C#中下限非零的数组解析

谈到数组时,当被问及数组是从什么数开始时,估计大部分程序员都会直接说出数组当然是从0开始的.这个回答当然没有错,现在我们就来了解一下C#中的下限非0的数组. 首先看一下数组的相关介绍: 1.数组:是允许将多个数据项当作一个集合来处理的机制. 2.数组的分类:在CLR中,数组可分为一维数组,多维数组,交错数组. 3.数组的类型:由于所有的数组都是继承自System.Array这个抽象类型,而这个类型又是继承自System.Object,这就说明数组是引用类型. 在创建数组时,除了有数组元素,数组对

canvas填充规则,非零环绕

1.看一块区域是否填充 2.从这个区域拉一条直线 3,看和这条直线相交的轨迹 4.如果顺时针轨迹+1 5.如果逆时针轨迹-1 6.所有轨迹的值计算出来 7.如果是非0,那么填充 8.如果是0那么不填充 原文地址:https://www.cnblogs.com/Yanss/p/10419786.html

Android中Canvas绘图之PorterDuffXfermode使用及工作原理详解

概述 类android.graphics.PorterDuffXfermode继承自android.graphics.Xfermode.在用Android中的Canvas进行绘图时,可以通过使用PorterDuffXfermode将所绘制的图形的像素与Canvas中对应位置的像素按照一定规则进行混合,形成新的像素值,从而更新Canvas中最终的像素颜色值,这样会创建很多有趣的效果.当使用PorterDuffXfermode时,需要将将其作为参数传给Paint.setXfermode(Xfermo

JavaScript中Object.prototype.toString方法的原理

在JavaScript中,想要判断某个对象值属于哪种内置类型,最靠谱的做法就是通过Object.prototype.toString方法. ? 1 2 var arr = []; console.log(Object.prototype.toString.call(arr)) //"[object Array]" 本文要讲的就是,toString方法是如何做到这一点的,原理是什么. ECMAScript 3 在ES3中,Object.prototype.toString方法的规范如下: