上一篇文章是10.24写的,是在我考试前,写了一些最近一段时间的感悟和体会。
很多时候不是知识变得廉价啦,而是获得知识的方式更加便捷啦。普通人一句话就能生成一个网站,一句话就能生成一个高深算法的实现,生产力得到空前的提升。从另一方面来看,AI所提升的生产力是一把双刃剑,如果你用AI能提升很高的生产力,那么你的工作以后很有可能被AI替代,相反那些无法被AI助力的岗位,反而更稳定,比如泥瓦匠,木工,搬运工。😂...扯远了。
今天来说一下基于paperjs 使用鼠标来绘制贝塞尔曲线。
在图形编辑中,如何友好地绘制贝塞尔曲线是衡量一个编辑器的重要指标之一,你要问我为什么?我只能告诉你,自然界中有两种线,一种是直线,另一种是曲线。作为组成我们世界不可分割,且非常优美的曲线,曲线是非常值得研究的。
贝塞尔曲线我就不过多介绍了,网上的资料已经汗牛充栋。
看一下实现的效果,可以使用鼠标绘制贝塞尔曲线,也可以对曲线进行二次编辑,拖拽控制点对曲线进行变形。

来说一下其中用到的api
首先必须要要用的是paperjs的 tool,因为我们要实现在鼠标点下时的元素命中,
以及鼠标拖拽时的路程计算。
定义鼠标的
- 鼠标按下按键 onMouseDown
- 鼠标移动 onMouseMove
- 鼠标拖拽 onMouseDrag
- 鼠标按键抬起 onMouseUp

在这个例子里我创建了两个工具,一个用于绘制曲线,一个用于编辑曲线。
绘制曲线时,首先是创建一个path对象,并获取该path的最后一个 Segment
当拖拽时,获取到移动的向量,然后对Segment的 handleIn 和handleOut 进行加减,这样就组成了一个贝塞尔曲线。
当点击编辑曲线时,实际是激活另一个paper.tool,这样就能执行新的鼠标按压和鼠标拖拽的交互逻辑。
在编辑曲线时,我们需要借助 paper.project.hitTest 来命中元素,相当于使用鼠标选中一个要编辑的元素,有了要操作的实体,我们才能进行下一步。在使用hitTest时,我们也能获取到我们命中的类型,可以是path,也可以是stroke,也可能是segment,也可以是handle-in,或者handle-out。根据命中的不同元素类型我们可以执行不同的交互逻辑。
比如命中stroke时,增加一个segment。命中segment时 删除这个segment。
如果命中handle-in 或者handle-out 就可以对曲线进行修改,拖拽handle-in 来改变曲线延伸的方向。
最近看了一下paperjs的源码,核心代码并不是使用原型链面向对象的方法来实现的,看起来比较费劲,但不排除它是一个非常优秀的引擎,其中的基于向量的思想很值得学习,后续有时间我也会和大家分享一下解读它的源码的心得。
最近身体总是不舒服,业余时间需要多多锻炼,希望大家都有一个健康的身体。当你想迫不及待地想去做一件事情是,你的颈椎,你的腰,你的手臂,你的注意力 告诉你,要去休息了,要去保养啦,就很拉胯。
最近系统架构师的成绩出来啦,一共差了12分,就能拿证啦。很遗憾,考前两个月一直在出差加班,住在龙华两个月,最后一星期才回南山,在这样的情况下,这个成绩也对得起我的准备。
一次不过,下次一定要考的更好,将系统架构设计的知识 学的更扎实,塞翁失马焉知非福。