Canvas绘图挖空效果

开发中遇到一个BUG,绘制的图形中,有些重叠的部分不填充颜色,也就是出现挖空效果,有些又不挖空。
排查过程:
1、在新的页面中,只绘制这里两个图形,稳定复现挖空效果,
2、手动绘制两个矩形却不挖空,用moveTo lineTo 绘制矩形同样不挖空
3、观察两个图形的坐标,发现一个是顺时针一个是逆时针。
4、翻转其中一个图形的坐标数组,再次绘制,挖空效果消失。

结论:Canvas绘图的时候,两个重叠的图形,如果绘制方向不一致,则会出现挖空效果。

问题:如何检测是否是顺时针?
看这里: https://www.cnblogs.com/wangyumin/p/5323518.html
搬运:
判断三点是顺时针还是逆时针方向
设 p1=(x1,y1), p2=(x2,y2), p3=(x3,y3)
求向量
p12=(x2-x1,y2-y1)
p23=(x3-x2,y3-y2)
则当 p12 与 p23 的叉乘(向量积)
p12 x p23 = (x2-x1)(y3-y2)-(y2-y1)(x3-x2)
为正时,p1-p2-p3 路径的走向为逆时针,
为负时,p1-p2-p3 走向为顺时针,
为零时,p1-p2-p3 所走的方向不变,亦即三点在一直线上。

代码实现:

function testClockwise (lines) {
    var c = (lines[1].x-lines[0].x)*(lines[2].y-lines[1].y)-(lines[1].y-lines[0].y)*(lines[2].x-lines[1].x);
    return c < 0
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值