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 性能优化指南(2)
May 21 Javascript
JavaScript中的property和attribute介绍
Dec 26 Javascript
引用外部js乱码问题分析及解决方案
Apr 12 Javascript
利用js正则表达式验证手机号,email地址,邮政编码
Jan 23 Javascript
jQuery获取DOM节点实例分析(2种方式)
Dec 15 Javascript
jQuery Validate 数组 全部验证问题
Jan 12 Javascript
JavaScript实现删除数组重复元素的5种常用高效算法总结
Jan 18 Javascript
vue2.0组件之间传值、通信的多种方式(干货)
Feb 10 Javascript
AngularJS模态框模板ngDialog的使用详解
May 11 Javascript
vue中实现左右联动的效果
Jun 22 Javascript
vue使用Proxy实现双向绑定的方法示例
Mar 20 Javascript
JavaScript的查询机制LHS和RHS解析
Aug 16 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]
2006/10/09 PHP
深入php var_dump()函数的详解
2013/06/05 PHP
WordPress中用于获取文章作者与分类信息的方法整理
2015/12/17 PHP
WordPress的主题编写中获取头部模板和底部模板
2015/12/28 PHP
PHP7 新增常量
2021/03/09 PHP
js arguments对象应用介绍
2012/11/28 Javascript
js动态生成指定行数的表格
2013/07/11 Javascript
js获取form的方法
2015/05/06 Javascript
JS实现页面载入时随机显示图片效果
2016/09/07 Javascript
用angular实现多选按钮的全选与反选实例代码
2017/05/23 Javascript
vue快捷键与基础指令详解
2017/06/01 Javascript
nodejs 子进程正确的打开方式
2017/07/03 NodeJs
动态统计当前输入内容的字节、字符数的实例详解
2017/10/27 Javascript
vue基于element-ui的三级CheckBox复选框功能的实现代码
2018/10/15 Javascript
js canvas画布实现高斯模糊效果
2018/11/27 Javascript
JS实现的新闻列表自动滚动效果示例
2019/01/30 Javascript
ElementUI radio组件选中小改造
2019/08/12 Javascript
js实现图片实时时钟
2020/01/15 Javascript
python将人民币转换大写的脚本代码
2013/02/10 Python
python 字典(dict)遍历的四种方法性能测试报告
2014/06/25 Python
介绍Python的@property装饰器的用法
2015/04/28 Python
浅谈配置OpenCV3 + Python3的简易方法(macOS)
2018/04/02 Python
浅谈pytorch和Numpy的区别以及相互转换方法
2018/07/26 Python
set在python里的含义和用法
2019/06/24 Python
Django框架反向解析操作详解
2019/11/28 Python
python创建子类的方法分析
2019/11/28 Python
python函数超时自动退出的实操方法
2020/12/28 Python
Python环境搭建过程从安装到Hello World
2021/02/05 Python
亚历山大·王官网:Alexander Wang
2017/06/23 全球购物
美国高级音响品牌:Master&Dynamic
2018/07/05 全球购物
意向书范本
2014/07/29 职场文书
演讲稿的格式及范文
2014/08/22 职场文书
2014年移动公司工作总结
2014/12/08 职场文书
2015年司法局工作总结
2015/05/22 职场文书
当幸福来敲门英文观后感
2015/06/01 职场文书
创业计划书之青年旅馆
2019/09/23 职场文书