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


Posted in Javascript onJune 25, 2018

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

先上代码

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
自动完成JS类(纯JS, Ajax模式)
Mar 12 Javascript
说说JSON和JSONP 也许你会豁然开朗
Sep 02 Javascript
动态显示可输入的字数提示还可以输入的字数
Apr 01 Javascript
JavaScript实现快速排序的方法
Jul 31 Javascript
理解JavaScript中worker事件api
Dec 25 Javascript
javascript中apply、call和bind的使用区别
Apr 05 Javascript
JavaScript的Ext JS框架中的GridPanel组件使用指南
May 21 Javascript
JS点击某个图标或按钮弹出文件选择框的实现代码
Sep 27 Javascript
JS实现重新加载当前页面或者父页面的几种方法
Nov 30 Javascript
Vue 兄弟组件通信的方法(不使用Vuex)
Oct 26 Javascript
vue+springboot前后端分离实现单点登录跨域问题解决方法
Jan 30 Javascript
vue iview实现动态路由和权限验证功能
Apr 17 Javascript
详解React之父子组件传递和其它一些要点
Jun 25 #Javascript
Vue EventBus自定义组件事件传递
Jun 25 #Javascript
一个Vue页面的内存泄露分析详解
Jun 25 #Javascript
Vue.js项目中管理每个页面的头部标签的两种方法
Jun 25 #Javascript
angularjs结合html5实现拖拽功能
Jun 25 #Javascript
vue中vee validate表单校验的几种基本使用
Jun 25 #Javascript
超出JavaScript安全整数限制的数字计算BigInt详解
Jun 24 #Javascript
You might like
基于php实现长连接的方法与注意事项的问题
2013/05/10 PHP
浅析php中json_encode()和json_decode()
2014/05/25 PHP
ThinkPHP模板替换与系统常量及应用实例教程
2014/08/22 PHP
仿dedecms下拉分页样式修改的thinkphp分页类实例
2014/10/30 PHP
PHP创建文件,并向文件中写入数据,覆盖,追加的实现代码
2016/03/25 PHP
PHP的mysqli_rollback()函数讲解
2019/01/23 PHP
Javascript !!的作用
2008/12/04 Javascript
js Flash插入函数免激活代码
2009/03/31 Javascript
jquery 弹出层实现代码
2009/10/30 Javascript
js数字输入框(包括最大值最小值限制和四舍五入)
2009/11/24 Javascript
使用GruntJS链接与压缩多个JavaScript文件过程详解
2013/08/02 Javascript
jquery使用正则表达式验证email地址的方法
2015/01/22 Javascript
JS中的phototype详解
2017/02/04 Javascript
整理关于Bootstrap表单的慕课笔记
2017/03/29 Javascript
实例分析JS与Node.js中的事件循环
2017/12/12 Javascript
利用JS动态生成隔行换色HTML表格的两种方法
2018/10/09 Javascript
手写Vue弹窗Modal的实现代码
2019/09/11 Javascript
vue使用微信扫一扫功能的实现代码
2020/04/11 Javascript
使用Python的urllib2模块处理url和图片的技巧两则
2016/02/18 Python
Python 通过pip安装Django详细介绍
2017/04/28 Python
Python装饰器用法示例小结
2018/02/11 Python
Jupyter中直接显示Matplotlib的图形方法
2018/05/24 Python
python3实现域名查询和whois查询功能
2018/06/21 Python
Python多线程threading模块用法实例分析
2019/05/22 Python
Python从文件中读取指定的行以及在文件指定位置写入
2019/09/06 Python
Python 实现一个手机号码获取妹子名字的功能
2019/09/25 Python
Python创建空列表的字典2种方法详解
2020/02/13 Python
python使用信号量动态更新配置文件的操作
2020/04/01 Python
css3 transform属性详解
2014/09/30 HTML / CSS
Bodum官网:咖啡和茶壶、玻璃器皿、厨房电器等
2018/08/01 全球购物
大学生职业生涯规划书模板
2014/01/18 职场文书
数控专业大学毕业生职业规划范文
2014/02/06 职场文书
统计岗位职责
2014/02/21 职场文书
2014年父亲节活动方案
2014/03/06 职场文书
森林防火宣传标语
2014/06/27 职场文书
python tqdm用法及实例详解
2021/06/16 Python