当前位置: 首页 > article >正文

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

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

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

下面就进入正题啦

在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="booleans('unite')">合并</button>
 <button onclick="booleans('intersect')">交集</button>
 <button onclick="booleans('subtract')">差集</button>
 <button onclick="booleans('exclude')">排除</button>
 <button onclick="booleans('divide')">切割</button>

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

function booleans(operation) {
  paper.project.clear()
  result = null
  init()
  result = square[operation](outer);
  square.visible = false
  outer.visible = false
  console.log(result)
}

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

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

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

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

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

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

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

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


http://www.kler.cn/a/522048.html

相关文章:

  • Python NumPy(7):连接数组、分割数组、数组元素的添加与删除
  • SpringBoot中@Valid与@Validated使用场景详解
  • 第十六届蓝桥杯大赛软件赛(编程类)知识点大纲
  • 萌新学 Python 之数值处理函数 round 四舍五入、abs 绝对值、pow 幂次方、divmod 元组商和余数
  • 可爱狗狗的404动画页面HTML源码
  • 图神经网络驱动的节点分类:从理论到实践
  • 若依基本使用及改造记录
  • 【C++】0xc0000005写入位置时发生访问冲突解决方法
  • 基于51单片机和ESP8266(01S)、LCD1602、DS1302、独立按键的WiFi时钟
  • sprinboot车辆充电桩
  • 面试场景问题集合
  • AI大模型DreamShaper XL v2系列分享,适用于Stable Diffusion和ComfyUI
  • 【PySide6快速入门】ui文件的使用
  • 【机器学习】自定义数据集 使用paddlepaddle框架实现逻辑回归并保存模型,然后保存模型后再加载模型进行预测
  • Dismissible组件的用法
  • 【搜索回溯算法】:BFS的魔力--如何使用广度优先搜索找到最短路径
  • WPF进阶 | WPF 数据绑定进阶:绑定模式、转换器与验证
  • 病理AI领域基础模型及多实例学习方法的性能评估|顶刊精析·25-01-27
  • 算法刷题Day29:BM67 不同路径的数目(一)
  • 前端性能优化指标 - DCL - 计算 DCL 时间(使用 JavaScript、使用 Chrome DevTools)
  • LeetCode讲解篇之88. 合并两个有序数组
  • C语言算法实现:探索经典排序与查找算法的奥秘
  • 在亚马逊云科技上用Stable Diffusion 3.5 Large生成赛博朋克风图片(下)
  • Day27-【13003】短文,线性表两种基本实现方式空间效率、时间效率比较?兼顾优点的静态链表是什么?如何融入空闲单元链表来解决问题?
  • 二分查找题目:寻找两个正序数组的中位数
  • Maya快捷键