js实例教程-JavaScript多段线实现布尔运算的方法

发布时间:2018-12-06 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了js实例教程-JavaScript多段线实现布尔运算的方法脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
小宝典致力于为广大程序猿(媛)提供高品质的代码服务,请大家多多光顾小站,小宝典在此谢过。

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

 //获得布尔运算后的全部曲线     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技巧,巧夺天工,精雕玉琢。小宝典献丑了!

脚本宝典总结

以上是脚本宝典为你收集整理的js实例教程-JavaScript多段线实现布尔运算的方法全部内容,希望文章能够帮你解决js实例教程-JavaScript多段线实现布尔运算的方法所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。