摘要:这篇文章主要介绍多段线实现布尔运算的方法由于一些曲线类实现方法不一,这里主要说一些实现布尔运算的思路

小宝典致力于为广大程序猿(媛)提供高品质的代码服务,请大家多多光顾小站,小宝典在此谢过。

这篇文章主要介绍多段线实现布尔运算的方法

 //获得布尔运算后的全部曲线     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 = source.GetSplitCurves(pars1);              cus1.forEach(pl =>             {                 if (isTargetCurInSourceCur(target, pl))                 {                     intersectionList.push(pl);                 }                 else                 {                     subList.push(pl);                     unionList.push(pl);                 }             })              let cus2: Array = 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封闭曲线分割为多个部分

最后,对分割后的线段进行整理,其中相交部分是曲线在对方曲线内部的部分,合并是互不在对方曲线内部的部分,相减类似不想说了,具体看代码,如果是被包含状态则更加就简单了

这篇文章主要介绍多段线实现布尔运算的方法

 //获得布尔运算后的全部曲线     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 = source.GetSplitCurves(pars1);              cus1.forEach(pl =>             {                 if (isTargetCurInSourceCur(target, pl))                 {                     intersectionList.push(pl);                 }                 else                 {                     subList.push(pl);                     unionList.push(pl);                 }             })              let cus2: Array = 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封闭曲线分割为多个部分

最后,对分割后的线段进行整理,其中相交部分是曲线在对方曲线内部的部分,合并是互不在对方曲线内部的部分,相减类似不想说了,具体看代码,如果是被包含状态则更加就简单了

觉得可用,就经常来吧!Javascript技巧 脚本宝典 欢迎评论哦! js技巧,巧夺天工,精雕玉琢。小宝典献丑了!