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 相关文章推荐
jQuery 在光标定位的地方插入文字的插件
May 10 Javascript
JS连接SQL数据库与ACCESS数据库的方法实例
Nov 21 Javascript
cookie中的path与domain属性详解
Dec 18 Javascript
jQuery中选择器小问题(新人难免遇到)
Mar 31 Javascript
给html超链接设置事件不使用href来完成跳
Apr 20 Javascript
浏览器窗口大小变化时使用resize事件对框架不起作用的解决方法
May 11 Javascript
Jquery全屏相册插件zoomvisualizer具有调节放大与缩小功能
Nov 02 Javascript
基于JavaScript实现TAB标签效果
Jan 12 Javascript
bootstrapValidator bootstrap-select验证不可用的解决办法
Jan 11 Javascript
利用JQuery操作iframe父页面、子页面的元素和方法汇总
Sep 10 jQuery
js实现双色球效果
Aug 02 Javascript
js+audio实现音乐播放器
Sep 13 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
为了这两部电子管收音机,买了6套全新电子管和10粒刻度盘灯泡
2021/03/02 无线电
PHP 多进程 解决难题
2009/06/22 PHP
PHP使用CURL获取302跳转后的地址实例
2014/05/04 PHP
php使用正则表达式获取字符串中的URL
2016/12/29 PHP
javascript 火狐(firefox)不显示本地图片问题解决
2008/07/05 Javascript
实现JavaScript中继承的三种方式
2009/10/16 Javascript
利用JQuery+EasyDrag 实现弹出可拖动的Div,同时向Div传值,然后返回Div选中的值
2009/10/24 Javascript
一步步教大家编写酷炫的导航栏js+css实现
2016/03/14 Javascript
jQuery过滤特殊字符及JS字符串转为数字
2016/05/26 Javascript
浅谈js多维数组和hash数组定义和使用
2016/07/27 Javascript
Javascript+CSS3实现进度条效果
2016/10/28 Javascript
从对象列表中获取一个对象的方法,依据关键字和值
2017/09/20 Javascript
NodeJs 实现简单WebSocket即时通讯的示例代码
2019/08/05 NodeJs
微信小程序仿通讯录功能
2020/04/09 Javascript
JS实现百度搜索框
2021/02/25 Javascript
python二叉树的实现实例
2013/11/21 Python
python使用wxpython开发简单记事本的方法
2015/05/20 Python
Python计算字符宽度的方法
2016/06/14 Python
Python实现读写sqlite3数据库并将统计数据写入Excel的方法示例
2017/08/07 Python
python中利用Future对象回调别的函数示例代码
2017/09/07 Python
Python常见字符串操作函数小结【split()、join()、strip()】
2018/02/02 Python
python pandas库中DataFrame对行和列的操作实例讲解
2018/06/09 Python
Python对切片命名的实现方法
2018/10/16 Python
Python中logging实例讲解
2019/01/17 Python
python 根据网易云歌曲的ID 直接下载歌曲的实例
2019/08/24 Python
详解python路径拼接os.path.join()函数的用法
2019/10/09 Python
Python使用扩展库pywin32实现批量文档打印实例
2020/04/09 Python
python 弧度与角度互转实例
2020/04/15 Python
Tory Burch美国官方网站:美国时尚生活品牌
2016/08/01 全球购物
美国汽配连锁巨头Pep Boys官网:轮胎更换、汽车维修服务和汽车零部件
2017/01/14 全球购物
UNOde50美国官网:西班牙珠宝品牌
2020/08/15 全球购物
法学专业求职信
2014/07/15 职场文书
2014年党务工作总结
2014/11/25 职场文书
2015年教师自我评价范文
2015/03/04 职场文书
教师病假条范文
2015/08/17 职场文书
Pyqt5将多个类组合在一个界面显示的完整示例
2021/09/04 Python