关于Path.unite()方法边缘异常情况的技术咨询
关于Paper.js中
unite()布尔运算异常问题的解答 嘿,我来帮你理清这个Paper.js里unite()运算的问题~你遇到的两个情况,根源其实是同一个:Paper.js的布尔运算方法(包括unite())只认闭合且有面积的路径,开放路径或者没有面积的退化路径根本没法参与有效运算。
逐个问题拆解
1. 单点路径 + 两点路径unite()无结果
单点路径本身就是个没有面积的“空架子”,两点路径是开放的线条(没闭合,也没有填充面积),布尔运算的核心是基于图形的填充区域计算并集/交集,这俩都不满足条件,自然运算后出不来有效结果。
2. 两点路径与闭合图形unite()只返回最后一个图形
当你用闭合的正方形(carre)调用unite()传入开放的线条(ligne)时,Paper.js根本没法对开放路径做布尔运算处理,所以这个操作其实等于啥也没干——unite()直接返回了原正方形,看起来就像是“忽略了那条线”。
解决办法
要让线条这类开放路径参与布尔运算,得先给它“赋予面积”,转成闭合路径才行:
方案:把开放线条转为有面积的闭合轮廓
用getStrokeOutline()方法把线条转成它的轮廓路径(这是个闭合的、有填充面积的图形),之后就能正常做unite()了:
var carre = new Path({ segments: [[30, 75], [30, 25], [80, 25], [80, 75]], strokeColor: 'black', closed: true }); carre.fullySelected = true; // 原两点线条 var ligne = new Path({ segments: [[30, 75], [41, 25]], strokeColor: 'black', closed: false }); ligne.fullySelected = true; ligne.position.x += 100; // 将线条转为闭合的轮廓路径(有面积) var ligneOutline = ligne.getStrokeOutline(); // 执行并集运算 var uniteres = carre.unite(ligneOutline); uniteres.fullySelected = true; uniteres.position.x += 200;
关键提醒
所有要参与unite()、intersect()这类布尔运算的路径,必须满足两个条件:
closed: true(路径是闭合的)- 路径构成的形状有实际填充面积(不能是单点、开放线条这种退化图形)
如果只是想视觉上把线条和形状放在一起,直接用Group分组就行,但如果要真正的布尔运算结果,一定要转成闭合的有面积图形哦~
内容的提问来源于stack exchange,提问作者clouahab
相关产品推荐
相关产品推荐

