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 相关文章推荐
javascript代码加载优化方法
Jan 30 Javascript
js 利用className得到对象的实现代码
Nov 15 Javascript
点弹代码 点击页面任何位置都可以弹出页面效果代码
Sep 17 Javascript
JS获取URL中的参数数据
Dec 05 Javascript
详解Javacript和AngularJS中的Promises
Feb 09 Javascript
node.js中 stream使用教程
Aug 28 Javascript
省市区三级联动jquery实现代码
Apr 15 Javascript
微信小程序实现横向增长表格的方法
Jul 24 Javascript
turn.js异步加载实现翻书效果
Jul 25 Javascript
微信小程序登录时如何获取input框中的内容
Dec 04 Javascript
vue 检测用户上传图片宽高的方法
Feb 06 Javascript
详解JSON.stringify()的5个秘密特性
May 26 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获取当前文件所在目录 getcwd()函数
2009/05/13 PHP
Yii净化器CHtmlPurifier用法示例(过滤不良代码)
2016/07/15 PHP
详解Yii2 rules 的验证规则
2016/12/02 PHP
php中简单的对称加密算法实现
2017/01/05 PHP
Dojo之路:如何利用Dojo实现Drag and Drop效果
2007/04/10 Javascript
jQuery学习笔记之jQuery动画效果
2013/09/09 Javascript
JavaScript实现穷举排列(permutation)算法谜题解答
2014/12/29 Javascript
jquery实现简单的二级导航下拉菜单效果
2015/09/07 Javascript
jQuery头像裁剪工具jcrop用法实例(附演示与demo源码下载)
2016/01/22 Javascript
js实现导航栏中英文切换效果
2017/01/16 Javascript
bootstrap轮播模板使用方法详解
2017/11/17 Javascript
vue vuex vue-rouert后台项目——权限路由(适合初学)
2017/12/29 Javascript
浅析vue-router jquery和params传参(接收参数)$router $route的区别
2018/08/03 jQuery
微信小程序实现slideUp、slideDown滑动效果及点击空白隐藏功能示例
2018/12/11 Javascript
vue项目中仿element-ui弹框效果的实例代码
2019/04/22 Javascript
vue操作动画的记录animate.css实例代码
2019/04/26 Javascript
JavaScript中的相等操作符使用详解
2019/12/21 Javascript
vue计算属性+vue中class与style绑定(推荐)
2020/03/30 Javascript
windows下添加Python环境变量的方法汇总
2018/05/14 Python
在Pycharm中对代码进行注释和缩进的方法详解
2019/01/20 Python
python实现桌面壁纸切换功能
2019/01/21 Python
关于tensorflow softmax函数用法解析
2020/06/30 Python
python判断一个变量是否已经设置的方法
2020/08/13 Python
详解html2canvas截图不能截取圆角图片的解决方案
2018/01/30 HTML / CSS
香港优质食材和美酒专门店:FoodWise
2017/09/01 全球购物
Wedgwood美国官网:英国骨瓷,精美礼品及家居装饰
2018/02/17 全球购物
澳大利亚快时尚鞋类市场:Billini
2018/05/20 全球购物
StubHub希腊:购买体育赛事、音乐会和剧院门票
2019/08/03 全球购物
《在家里》教后反思
2014/03/01 职场文书
文案策划求职信
2014/03/18 职场文书
六一节目主持词
2014/04/01 职场文书
机关单位工作失职检讨书
2014/11/20 职场文书
2015年护士节活动策划方案
2015/05/04 职场文书
2015年社区反邪教工作总结
2015/10/14 职场文书
python3读取文件指定行的三种方法
2021/05/24 Python
Spring JPA 增加字段执行异常问题及解决
2022/06/10 Java/Android