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 相关文章推荐
15个款优秀的 jQuery 图片特效插件推荐
Nov 21 Javascript
jsvascript图像处理—(计算机视觉应用)图像金字塔
Jan 15 Javascript
深入浅析knockout源码分析之订阅
Jul 12 Javascript
jQuery层次选择器用法示例
Sep 09 Javascript
Vue组件BootPage实现简单的分页功能
Sep 12 Javascript
Vue.JS入门教程之自定义指令
Dec 08 Javascript
浅析node.js的模块加载机制
May 25 Javascript
改进 JavaScript 和 Rust 的互操作性并深入认识 wasm-bindgen 组件
Jul 13 Javascript
vue 实现单选框设置默认选中值
Nov 07 Javascript
详解Node.js使用token进行认证的简单示例
May 25 Javascript
Vue用mixin合并重复代码的实现
Nov 27 Vue.js
jquery实现鼠标悬浮弹出气泡提示框
Dec 23 jQuery
详解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版本不同可能诱发的问题
2015/12/22 PHP
php连接oracle数据库的方法(测试成功)
2016/05/26 PHP
破除网页鼠标右键被禁用的绝招大全
2006/12/27 Javascript
js与jquery中获取当前鼠标的x、y坐标位置的代码
2011/05/23 Javascript
js中typeof的用法汇总
2013/12/12 Javascript
jQuery 追加元素的方法如append、prepend、before
2014/01/16 Javascript
JavaScript中的replace()方法使用详解
2015/06/06 Javascript
jQuery实现浮动层随浏览器滚动条滚动的方法
2015/09/22 Javascript
JS跨域解决方案之使用CORS实现跨域
2016/04/14 Javascript
AngularJS 如何在控制台进行错误调试
2016/06/07 Javascript
JavaScript 监控微信浏览器且自带返回按钮时间
2016/11/27 Javascript
JS实现微信摇一摇原理解析
2017/07/22 Javascript
Vue.js中对css的操作(修改)具体方式详解
2018/10/30 Javascript
详解Vue项目中实现锚点定位
2019/04/24 Javascript
JavaScript实现的弹出遮罩层特效经典示例【基于jQuery】
2019/07/10 jQuery
VUE:vuex 用户登录信息的数据写入与获取方式
2019/11/11 Javascript
js实现时分秒倒计时
2019/12/03 Javascript
原生js中运算符及流程控制示例详解
2021/01/05 Javascript
[05:29]2014DOTA2国际邀请赛 赛后专访:LGDNewbee顺利过关
2014/07/13 DOTA
[01:32]DOTA2 2015国际邀请赛中国区预选赛第四日战报
2015/05/29 DOTA
wxPython框架类和面板类的使用实例
2014/09/28 Python
Python的SQLalchemy模块连接与操作MySQL的基础示例
2016/07/11 Python
Python正则表达式经典入门教程
2017/05/22 Python
PyQt+socket实现远程操作服务器的方法示例
2019/08/22 Python
Python爬虫库BeautifulSoup获取对象(标签)名,属性,内容,注释
2020/01/25 Python
Python错误的处理方法
2020/06/23 Python
Python3中FuzzyWuzzy库实例用法
2020/11/18 Python
python爬虫中抓取指数的实例讲解
2020/12/01 Python
技术合作协议书范本
2014/04/18 职场文书
党员“四风”问题批评与自我批评思想汇报
2014/10/06 职场文书
上学路上观后感
2015/06/16 职场文书
培训班开班主持词
2015/07/02 职场文书
2016年小学生清明节广播稿
2015/12/17 职场文书
go select编译期的优化处理逻辑使用场景分析
2021/06/28 Golang
Redis中有序集合的内部实现方式的详细介绍
2022/03/16 Redis
win10搭建配置ftp服务器的方法
2022/08/05 Servers