为了账号安全,请及时绑定邮箱和手机立即绑定

bezier插值绕过打结问题

标签:
AngularJS


html5 canvas bezierCurveTo涉及4个点:o(开始点),cp1(控制点1),cp2(控制点2),p(结束点)

bezier插值绕过打结问题

当 o到p的走向(向量op)和cp1到cp2的走向(向量c12)相反时,就会出现打结的情况,我采取降级处理的方法,即发现会打结时,改为使用lineTo:

                p = parts[i][j];

                var o = parts[i][j-1]; //p前面一点

                var cp1 = cps[2*(j-1)];

                var cp2 = cps[2*j-1];

                var op = p.subtract(o),c12=cp2.subtract(cp1);

                //绕过打结问题

                if(op.x*c12.x+op.y*c12.y>0) //控制点走向和折线走向一致

                    ctx.bezierCurveTo(cp1.x,cp1.y, cp2.x,cp2.y, p.x, p.y);

                else

                    ctx.lineTo(p.x,p.y);

向量夹角公式:

cosθ=向量a×向量b/|向量a|×|向量b| = (x1x2+y1y2)/[√(x1²+y1²)√(x2²+y2²)]

我将两向量夹角大于90度判定为两向量反向,

当180>θ>90时cosθ<0,夹角公式分母总为正,所以只要判定分子的正负即可。

过特征点平滑效果,可参考:

https://blog.csdn.net/u011284073/article/details/81385922

控制点的计算过程可以参考 http://turfjs.org/docs#bezierSpline 的源码,中点连线平移得到控制点,其使用的方法即:https://blog.csdn.net/ch_soft/article/details/7401582

©著作权归作者所有:来自51CTO博客作者dressame的原创作品,如需转载,请注明出处,否则将追究法律责任


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消