视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
JavaScript实现封闭区域布尔运算的示例代码
2020-11-27 22:12:29 责编:小采
文档

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

先上代码

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

下载本文
显示全文
专题