Canvas踩坑(2)马克笔效果

1,975 阅读1分钟

原文地址 21ido.com/2018/12/27f…


Marker Pen

画笔里面,马克笔算是比较简单,比较难的是铅笔和毛笔

一般的线是由点连起来的,设置好 lineCaplineJoin 即可,但马克笔是由连起来的

当我们拿到一个XY坐标点后,需进行扩大,使其变成一个矩形

Marker Pen

每个点转成矩形后,会形成这样的效果

Marker Pen

所以还需要依次将各个矩形连起来

Marker Pen

连起来需要6个点,这6个点还需要根据2个坐标点的相对位置来判断
如果是上下或左右的移动,则只需4个点

将每2个坐标点连起来后是这样

Marker Pen

然后 fill() 进行填充

Marker Pen

然后我就懵逼

Marker Pen

放大看,会发现有些重叠的区域并没有被填充

没有填充是因为canvas把那些区域判断为线外区域,这涉及到nonzero和evenodd填充规则,可以看下 张鑫旭的这篇 《搞懂SVG/Canvas中nonzero和evenodd填充规则》

简单说就是连点方式顺时针和逆时针的差异,导致了填充时把内部区域判断为外部区域

测试发现只有在点往左下方画的时候会出现这个问题,于是单独把往右下角的连线方式改为逆时针,问题就解决了
比如已上图为例,默认连线是 A1 -> B1 -> B2 -> C2 -> D2 -> D1 -> A1
则逆时针反过来连,这跟交叉线夹角有关