布尔运算中的边缘情况错误
作者: pearcetm创建于 2024年7月9日更新于 2025年10月14日
@lehni (英语). 首先谢谢你的图书馆 它与OpenSeadragon——有一个演示页[此处](https://pearcetm. 这个项目仍然是一项积极的工作,但已经证明它对我正在建造的其他一些应用程序非常有用。
我遇到了几个问题 与布尔操作(例如减,相交). 其中一个我追踪到 并想出一个解决方案, 另一个我仍在努力 排序。 两者都往往会影响复杂的路径,如由魔法魔杖工具所创造的路径(您可以在演示页中看到以供参考).
第一期:浮标分解 -- -- 确定工作范围 当使用大坐标值时(一般在10,000-20,000+范围内),第一个作物会上升。 当值如此之大时,被添加到坐标上的"epsilon"会由于浮点精度而被截断,从而打乱起风的计算. 我的工作方向是测试这些路径的界限是否足够大,足以引起这个问题,如果是的话,根据需要翻译并缩放路径以缩小坐标的大小,然后进行布尔操作,然后取消转换。 我执行这个是猴子补丁 而不是直接修改图书馆代码本身 我在这里发布代码 以防对其他人有用 如果你同意这个方法, 我可以尝试把公关合并起来, 在这个图书馆内部更正式地解决这个问题。
// Monkey补丁了纸张.js 布尔操作以说明浮点数学的问题
// 当使用大坐标值时(1 000是一个似乎可靠工作的模版值)
const funcs = ['unite','intersect','subtract','unite','diviide']; 2.
用于( 复合真菌){
原文=纸张。 Path Project.prototype [func]; (原始内容存档于2017-09-29).
paper.Path 项目.prototype [func] = 函数 (){
const 路径 = 参数 [0],
数值阈值 = 1000, // 嵌入式
b1 = 这个. getBoundes (,),
b2 = 路径. getBoundes (,),
l=数学(b1.x,b2.x),
r = Math.max(b1.x + b1.width, b2.x + b2.width), 出品人.
t = Math.min(b1.y, b2.y), 简称为"一".
b = Math.max(b1.y + b1.高,b2.y + b2.高);
如果(l > -- -- 数字门槛 -- -- )
r < 数字风险值 {}
t > - 数值临界值 {}
b < 数值阈值 > {
// 我们的界限在限度内:不需要翻译或缩放,只需调用原始函数
返回正本. apply(此,参数);
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
// 我们的一个或多个界限已超出范围
// 计算是否需要缩放或只是翻译
. . . . . . .内容来源: paperjs/paper.js