其他分享
首页 > 其他分享> > 【WPF】搞懂SVG/Canvas中nonzero和evenodd填充规则

【WPF】搞懂SVG/Canvas中nonzero和evenodd填充规则

作者:互联网

一、填充有两种规则

nonzero evenodd缩略图

只要是路径填充,都有两种规则,nonzero和evenodd,无论是SVG中的路径填充,还是Canvas中的路径填充,如果还有其他和路径相关的技术(甚至设计软件),也离不开这两种填充规则。

换句话说,这是超越各种语言,普世通用的技能点。

下面,看看我能不能用足够精简的语言,尽可能让大家都搞懂这两种路径填充规则。

如果我们用3个点,连成一个三角形,则这两种填充规则没什么区别,如下对比(Canvas语法举例,JS实时渲染,如果无效果,请访问原文)。

nonzero(默认)evenodd
   

如果是两个三角形,并且发生重叠,差异就出现了,如下:

nonzero(默认)evenodd
   

究竟是如何作用的呢?且看~

二、一切都是交叉点们的选择

填充规则的关键,就是确定复杂路径构成的图形,哪些是内部,哪些是外部。内部则填充,外部则透明。

“nonzero规则”顾名思意就是“非零规则”,用通俗的话讲,就算计算某些东西是不是0,如果不是0则内部,填充;如果是0则外部,不填充。

“evenodd规则”顾名思意就是“奇偶规则”,用通俗的话讲,就算计算某些东西是不是奇数,如果是是奇数则内部,填充;如果是偶数则外部,不填充。

下面关键来了,这里的“计算某些东西”究竟计算的是什么东西呢?

nonzero规则和evenodd规则计算的东西还不一样,nonzero是计算顺时针逆时针数量,evenodd是交叉路径数量。


为了示意更加直观,我们可以把本文示意的三角路径方向和序号标记下,如下表:

nonzero(默认)evenodd
   

 

接下来,高能来了……


我们要判断某一个区域是路径内还是路径外,很简单,在这个区域内任意找一个点,然后以这个点为起点,发射一条无限长的射线,然后——

标签:nonzero,Canvas,evenodd,填充,路径,射线,规则,搞懂
来源: https://www.cnblogs.com/cdaniu/p/16574599.html