(编辑:jimmy 日期: 2024/11/20 浏览:2)
这篇文章主要介绍多段线实现布尔运算的方法
先上代码
function getOperatedCurves(sourceCurs: Curve[], targetCus: Curve[]) { let source: Polyline | Circle = (sourceCurs[0] instanceof Circle) "不是封闭曲线"); } 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 } }
由于一些曲线类实现方法不一,这里主要说一些实现布尔运算的思路
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。