JavaScript实现封闭区域布尔运算的示例代码
程序员文章站
2022-05-25 17:00:50
这篇文章主要介绍多段线实现布尔运算的方法
先上代码
function getoperatedcurves(sourcecurs: curve[], targ...
这篇文章主要介绍多段线实现布尔运算的方法
先上代码
function getoperatedcurves(sourcecurs: curve[], targetcus: curve[]) { let source: polyline | circle = (sourcecurs[0] instanceof circle) ? sourcecurs[0] as circle : new polyline().combine(sourcecurs)[0]; let target: polyline | circle = (targetcus[0] instanceof circle) ? targetcus[0] as circle : new polyline().combine(targetcus)[0]; try { if (!source.isclose || !target.isclose) throw new error("不是封闭曲线"); } catch (err) { console.log(err); } let interpts = source.intersectwith(target, intersectoption.onbothoperands); let sourcecontainertarget = istargetcurinsourcecur(source, target); let targetcontainersource = istargetcurinsourcecur(target, source); let iscontainer = sourcecontainertarget || targetcontainersource; let intersectionlist: curve[] = []; //交集 let unionlist: curve[] = []; //并集 let sublist: curve[] = []; //补集 /* *两封闭区域有交点并且不是包含关系,则通过交点把区域分割 */ if (interpts.length && !iscontainer) { let pars1 = interpts.map(p => source.getparamatpoint(p)).sort((a, b) => a - b); let pars2 = interpts.map(p => target.getparamatpoint(p)).sort((a, b) => a - b); let cus1: array<polyline | arc> = source.getsplitcurves(pars1); cus1.foreach(pl => { if (istargetcurinsourcecur(target, pl)) { intersectionlist.push(pl); } else { sublist.push(pl); unionlist.push(pl); } }) let cus2: array<polyline | arc> = target.getsplitcurves(pars2); cus2.foreach(pl => { if (istargetcurinsourcecur(source, pl)) { intersectionlist.push(pl); sublist.push(pl); } else { unionlist.push(pl); } }) } else { if (iscontainer) { if (sourcecontainertarget) { intersectionlist.push(target); sublist.push(source, target); unionlist.push(source); } else { unionlist.push(target); intersectionlist.push(source); } } else { unionlist.push(source, target) sublist.push(source); } } return { intersectionlist, unionlist, sublist } }
由于一些曲线类实现方法不一,这里主要说一些实现布尔运算的思路
- 判断2封闭曲线是否是被包含的关系
- 获取2封闭曲线的所有交点,这里交点可能是圆和线,线和线,圆和圆的,求交点的方法网上应该很多,以后有时间也会写写用javascript实现方式
- 根据所有的交点把2封闭曲线分割为多个部分
- 对分割后的线段进行整理,其中相交部分是曲线在对方曲线内部的部分,合并是互不在对方曲线内部的部分,相减类似不想说了,具体看代码,如果是被包含状态则更加就简单了
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。