最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
当前位置: 首页 - 科技 - 知识百科 - 正文

JavaScript实现封闭区域布尔运算的示例代码

来源:懂视网 责编:小采 时间:2020-11-27 22:12:29
文档

JavaScript实现封闭区域布尔运算的示例代码

JavaScript实现封闭区域布尔运算的示例代码:这篇文章主要介绍多段线实现布尔运算的方法 先上代码 function getOperatedCurves(sourceCurs: Curve[], targetCus: Curve[]) { let source: Polyline | Circle = (sourceCurs[0] instanceof Circle) ?
推荐度:
导读JavaScript实现封闭区域布尔运算的示例代码:这篇文章主要介绍多段线实现布尔运算的方法 先上代码 function getOperatedCurves(sourceCurs: Curve[], targetCus: Curve[]) { let source: Polyline | Circle = (sourceCurs[0] instanceof Circle) ?

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

先上代码

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
 }
 }

由于一些曲线类实现方法不一,这里主要说一些实现布尔运算的思路

  1. 判断2封闭曲线是否是被包含的关系
  2. 获取2封闭曲线的所有交点,这里交点可能是圆和线,线和线,圆和圆的,求交点的方法网上应该很多,以后有时间也会写写用JavaScript实现方式
  3. 根据所有的交点把2封闭曲线分割为多个部分
  4. 对分割后的线段进行整理,其中相交部分是曲线在对方曲线内部的部分,合并是互不在对方曲线内部的部分,相减类似不想说了,具体看代码,如果是被包含状态则更加就简单了

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文档

JavaScript实现封闭区域布尔运算的示例代码

JavaScript实现封闭区域布尔运算的示例代码:这篇文章主要介绍多段线实现布尔运算的方法 先上代码 function getOperatedCurves(sourceCurs: Curve[], targetCus: Curve[]) { let source: Polyline | Circle = (sourceCurs[0] instanceof Circle) ?
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top