图形编辑器基于Paper.js教程22:在图形矢量编辑器中,实现两个元素的差集,交集,并集,切割

news/2025/2/1 20:31:08/

在图形编辑器中,我们有时需要这样的一个图形,
在这里插入图片描述
或者这样的一个图形
在这里插入图片描述
像这种图形其实是基于相交的圆和矩形进行计算得出来的,这种操作大家一般叫做图形的布尔操作。
本片文章就教大家如何在图形编辑器中,实现 两个元素的差集,并集,合并,或者切割。

学会了这个技能,你就可以基于一些基本元素,组合成千奇百怪的图形。

下面就进入正题啦

在paperjs提供的例子中,有一个关于元素布尔操作的复杂案例,就是下面这个
http://paperjs.org/examples/boolean-operations/
在这里插入图片描述

这个案例将paperjs能够实现的5种布尔操作。
分别是 ['unite', 'intersect', 'subtract', 'exclude', 'divide'] ,其实还有一种reorient没有提到。

下面我们就相信看一下这些api,以及实现的效果
api详细的文档 http://paperjs.org/reference/path/#unite-path
在这里插入图片描述
首先,这些布尔操作都是Path (继承自PathItem)这个类下面的方法,而不是item,这就表明并不是所有的paperjs元素都是能进行布尔操作,而是只有path这个元素才能使用。 path属性基本对应 svg中的 path标签。

另外就是调用这个下方,只能是两个path进行操作,而不是 三个,四个。这就要求我们在设计这个功能时,也需要用户 选择了两个Path元素,才能使用。

我写了一个案例来演示各种操作。
下面看一下

布尔操作演示案例

首先我们在画布上画一个圆,一个矩形,并让两者相交

square = new paper.Path.Rectangle({position: paper.view.center,size: 300,// fillColor: 'red',strokeColor: 'black',strokeWidth: 1,strokeScaling: false,
});outer = new paper.Path.Circle({center: paper.view.center.add(-60, -60),radius: 140,// fillColor: 'blue',strokeColor: 'red',strokeWidth: 1,strokeScaling: false,
});

在这里插入图片描述
然后我们添加5个按钮,对应5种布尔操作,分别是

 <button onclick="javascript language-javascript">booleans('unite')">合并</button><button onclick="javascript language-javascript">booleans('intersect')">交集</button><button onclick="javascript language-javascript">booleans('subtract')">差集</button><button onclick="javascript language-javascript">booleans('exclude')">排除</button><button onclick="javascript language-javascript">booleans('divide')">切割</button>

然后我们的布尔操作方法如下:

function booleans(operation) {paper.project.clear()result = nullinit()result = square[operation](outer);square.visible = falseouter.visible = falseconsole.log(result)
}

首先我们每次操作前都清空画布,并初始化圆和矩形,为了保证每次布尔计算都相互不影响。

然后使用圆对矩形进行布尔计算。 result = square[operation](outer);
进行布尔计算后,会产生一个新的Path元素,默认会被直接渲染到页面上,你也可以使用参数控制是否渲染。为了不影响观看效果,我们将圆和矩形隐藏起来。
下面一起看一下 5种布尔操作的结果
第一种 unite 合并 如下图:
在这里插入图片描述

第二种 intersect 交集 如下图:
在这里插入图片描述
第三种 subtract 差集 如下图:
在这里插入图片描述

第四种 exclude 排除 如下图:看起来没有什么变换,官方的解释是
排除指定路径的几何图形与此路径几何图形的交点,并将结果作为新的路径项返回。
在这里插入图片描述

第五种,divide 切割 如下图:
在这里插入图片描述

另外需要注意的是,如是直线与封闭图形 进行布尔计算的话,只有合集和排除两种有结果,其他计算都没有效果,另外也需要看用谁来调用布尔计算,效果也不一样。使用时要多做实验。
在这里插入图片描述

这里演示的案例比较简单,大家可以多试试其他不规则图形的布尔计算,发挥你们的创意,这件事一件非常好玩的事情。

好了今天的文章就到这里啦,过年前 最后一个工作日,祝大家新年快乐🎉。


http://www.ppmy.cn/news/1568507.html

相关文章

使用Pygame制作“俄罗斯方块”游戏

1. 前言 俄罗斯方块&#xff08;Tetris&#xff09; 是一款由方块下落、行消除等核心规则构成的经典益智游戏&#xff1a; 每次从屏幕顶部出现一个随机的方块&#xff08;由若干小方格组成&#xff09;&#xff0c;玩家可以左右移动或旋转该方块&#xff0c;让它合适地堆叠在…

一文讲解JVM中的G1垃圾收集器

接上一篇博文&#xff0c;这篇博文讲下JVM中的G1垃圾收集器 G1在JDK1.7时引入&#xff0c;在JDK9时取代了CMS成为默认的垃圾收集器&#xff1b; G1把Java堆划分为多个大小相等的独立区域Region&#xff0c;每个区域都可以扮演新生代&#xff08;Eden和Survivor&#xff09;或老…

消息队列篇--通信协议篇--STOMP(STOMP特点、格式及示例,WebSocket上使用STOMP,消息队列上使用STOMP等)

STOMP&#xff08;Simple Text Oriented Messaging Protocol&#xff0c;简单面向文本的消息传递协议&#xff09;是一种轻量级、基于文本的协议&#xff0c;旨在为消息代理&#xff08;消息队列&#xff09;和客户端之间的通信&#xff08;websocket&#xff09;提供一种简单的…

Clock Controller of RH850/F1KH-D8, RH850/F1KM-S4, RH850/F1KM-S2

&esmp; 时钟控制器由时钟振荡电路、时钟选择电路、和时钟输出电路组成。   RH850/F1KH、RH850/F1KM单片机的时钟控制器具有以下特点: 六个片上时钟振荡器: 主振荡器(MainOSC),振荡频率分别为8、16、20和24 MHz子振荡器(SubOSC),振荡频率为32.768 kHz*1 100针的产品…

【浏览器 - Mac实时调试iOS手机浏览器页面】

最近开发个项目&#xff0c;需要在 Mac 电脑上调试 iOS 手机设备上的 Chrome 浏览器&#xff0c;并查看Chrome网页上的 console 信息&#xff0c;本来以为要安装一些插件&#xff0c;没想到直接使用Mac上的Safari 直接可以调试&#xff0c;再此记录下&#xff0c;分享给需要的伙…

基础项目实战——3D赛车(c++)

目录 前言一、渲染引擎二、关闭事件三、梯形绘制四、轨道绘制五、边缘绘制六、草坪绘制七、前后移动八、左右移动​九、曲线轨道​十、课山坡轨道​十一、循环轨道​十二、背景展示​十三、引入速度​十四、物品绘制​十五、课数字路障​十六、分数展示​十七、重新生成​十八、…

物联网智能项目之——智能家居项目的实现!

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///计算机爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于物联网智能项目之——智能家居项目…

青少年编程与数学 02-008 Pyhon语言编程基础 08课题、变量与赋值

青少年编程与数学 02-008 Pyhon语言编程基础 08课题、变量与赋值 一、变量1. 动态类型2. 命名规则3. 赋值4. 可变性5. 引用6. 作用域7. 垃圾回收 二、定义和使用变量1. 定义变量2. 变量命名规则3. 使用变量4. 变量的动态类型5. 多个变量赋值6. 序列解包7. 变量作用域8. 变量的可…