图形编辑器基于Paper.js教程32:绘制贝塞尔曲线,并进行二次编辑

上一篇文章是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分,就能拿证啦。很遗憾,考前两个月一直在出差加班,住在龙华两个月,最后一星期才回南山,在这样的情况下,这个成绩也对得起我的准备。

一次不过,下次一定要考的更好,将系统架构设计的知识 学的更扎实,塞翁失马焉知非福。

相关推荐
张元清21 分钟前
React useObjectUrl Hook:预览文件与 Blob,不留内存泄漏(2026)
javascript·react.js
姑苏倾城客29 分钟前
Flutter中,html 与 dart 桥接沟通
javascript·flutter·html
小粉粉hhh2 小时前
Node.js(五)——编写接口
前端·javascript·node.js
大意的百合2 小时前
Electron 应用如何上架微软商店:从 MSIX 打包到商店提交
javascript·microsoft·electron
csdndenglu2 小时前
Easy3D:一个轻量级、易用、高效的C++库,用于处理和渲染3D数据,无复杂要求时可替代VTK
开发语言·c++·图形渲染·3d渲染
weedsfly3 小时前
单例模式在前端中的正确打开方式
前端·javascript·面试
真的想不出名儿4 小时前
Md编辑器整合-react
前端·react.js·编辑器
多加点辣也没关系17 小时前
JavaScript|第4章:类型转换
开发语言·javascript
yqcoder17 小时前
httpOnly 是什么,又有什么用?
开发语言·前端·javascript
烬羽17 小时前
还在手动拼路径、写回调地狱?一文吃透 Node.js 的 path 和 fs
javascript·程序员·node.js