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

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

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

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

JavaScript实现封闭区域布尔运算相关推荐

  1. matlab填充封闭包含区域,求指导matlab怎么填充曲线构成的封闭区域

    matlab里面怎么填充两条曲线和右边界所围成的封闭区域.如下图 两条曲线是由两组数据构成的 789.JPG 两组数据为 2.70E-04        7.40E+02 3.52E-04      ...

  2. matlab封闭图面积,matlab求0-1封闭区域围成的面积

    做毕业设计需要用到这个,所以自己写了个函数.函数作用是求两张轮廓线图片不一致地方所围成区域的周长和面积.后面还要优化,先把大致结构贴在这里: function area_peri(a,b)%输入为两张 ...

  3. 高德地图定位误差_【“怼”上了,四川景区一度建议别用高德地图】导航定位错误引用户到封闭区域,致拥堵!高德地图道歉,已更正!...

    导航错误,致景区拥堵 10月4日下午,青城山都江堰景区与高德地图"怼"上了.该景区官方公众号"青城山都江堰"发文称,近来,青城山都江堰景区频繁接到游客反映,使用 ...

  4. 在网页上打印时用javascript设置打印区域和不打印区域,分页等

    <!--media=print 这个属性只在打印时有效--> <stylemedia=print>      .Noprint{display:none;}   //不打印   ...

  5. 计算机图形学:传统函数方法判定点在不规则封闭区域内的判定方法

    在封闭的多边形中,需要判断一个点在不在图形中 先在点处画一条竖直的线穿过图形 这时候记下A上下两边焦点的个数分别为1,为单数 但是B上下两边焦点的个数分别为0和2,为双数 那么找一个有凹面的多边形呢 ...

  6. JavaScript——除指定区域外点击任何地方隐藏DIV

    实现效果: 首先点击下拉箭头 出现选择的列表 然后点击列表的某一项,列表隐藏,或者点击这个区域外的地方隐藏列表 主要代码如下 html: <div class="input-box&q ...

  7. 计算点、线、面等元素之间的交点、交线、封闭区域面积和闭合集(续1)

    继续上一节的内容,本节主要讲解三维空间中射线.线段与平面及三维物体的交点及距离的计算,它们在碰撞检测和可见性剔除等应用中是必不可少的.首先给出3D空间下点乘和叉乘的定义与定理的推导,再谈如何应用到程序 ...

  8. 计算点、线、面等元素之间的交点、交线、封闭区域面积和闭合集(续7)

    介绍求取平面上顶点集合凸包的Graham Scan和Andrew's Monotone Chain方法.基本原理是在顶点排序好后,初始化一栈,循环取出顶点集合中每个顶点元素,将其与栈顶两元素进行判别, ...

  9. 判断点是否在点组成的封闭区域内c++

    大致方法可以有3种: 方法1:面积法 判断目标点与多边形的每条边组成的三角形面积和是否等于该多边形,相等则在多边形内部. 方法2:角度法 判断目标点与所有边的夹角和是否为360度,为360度则在多边形 ...

最新文章

  1. 100天后 - 100-days-later
  2. Response.Write详细介绍
  3. 用纸作出来的艺术品 漂亮!
  4. 一分钟深入Mysql的意向锁——《深究Mysql锁》
  5. zigbee 串口不稳定_Zigbee
  6. CF176E Archaeology(set用法提示)
  7. 行业看点 | 量子计算时代即将到来?华人科学家揭秘“天使粒子”背后故事……...
  8. simulink模块的输入端口与参数的关系
  9. 使用Anaconda3安装tensorflow,opencv,使其可以在spyder中运行
  10. C#的委托(delegate、Action、Func、predicate)
  11. 自动为数字千位数,百万位数添加逗号
  12. 开箱即用——用模板快速上线一个HR 服务中心
  13. 如何在php中添加音乐播放器,音乐播放器的制作实例(html5)-
  14. Java2048游戏源代码
  15. 圆和长方形周长相等谁的面积大_周长相等的长方形正方形和圆谁面积最大,谁面...
  16. IM系统架构设计之浅见
  17. Transmission搭建BT下载服务器
  18. Passenger, Apache/Nginx, Rails之间的关系
  19. 钉钉审批流API接口
  20. sql server 日期转换为英文格式

热门文章

  1. 【原创】请不要对Boost Format使用Byte作为参数
  2. [导入]Visual Studio 2005 Web Deployment Projects版本不同引发的问题
  3. java 中break如何跳出多层循环(包含二层循环)
  4. 怎么把jad反编译放到Eclipse中
  5. string转short java_[Java基础]之 数据类型转换
  6. js删除数组中指定元素_js中数组操作详解
  7. itextpdf添加表格元素_java使用iText生成pdf表格详解
  8. fanuc机器人四边形编程_中国工控 | FANUC 机器人码垛编程详解
  9. 清除浮动php,CSS清除浮动
  10. git master代码被删除 怎么恢复_git 分支的删除与恢复