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 arguments.callee的应用代码
May 07 Javascript
解决表单中第一个非隐藏的元素获得焦点的一个方案
Oct 26 Javascript
9款2014最热门jQuery实用特效推荐
Dec 07 Javascript
JavaScript移除数组内重复元素的方法
Mar 18 Javascript
jQuery添加删除DOM元素方法详解
Jan 18 Javascript
AngularJS中run方法的巧妙运用
Jan 04 Javascript
Angular2数据绑定详解
Apr 18 Javascript
Angular中管道操作符(|)的使用方法
Dec 15 Javascript
vue2.0 资源文件assets和static的区别详解
Apr 08 Javascript
微信小程序实现多选功能
Nov 04 Javascript
改进 JavaScript 和 Rust 的互操作性并深入认识 wasm-bindgen 组件
Jul 13 Javascript
Vue-cli打包后部署到子目录下的路径问题说明
Sep 02 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
详解WordPress中提醒安装插件以及隐藏插件的功能实现
2015/12/25 PHP
今天你说520了吗?不仅有php表白书还有java表白神器
2016/05/20 PHP
PHP读取并输出XML文件数据的简单实现方法
2017/12/22 PHP
PHP基于面向对象实现的留言本功能实例
2018/04/04 PHP
js中几种去掉字串左右空格的方法
2006/12/25 Javascript
js中关于String对象的replace使用详解
2011/05/24 Javascript
动态加载外部javascript文件的函数代码分享
2011/07/28 Javascript
js模仿hover的具体实现代码
2013/12/30 Javascript
简单谈谈javascript Date类型
2015/09/06 Javascript
JSON字符串和对象相互转换实例分析
2016/06/16 Javascript
vue环境搭建简单教程
2017/11/07 Javascript
微信小程序使用slider设置数据值及switch开关组件功能【附源码下载】
2017/12/09 Javascript
Vue源码探究之状态初始化
2018/11/14 Javascript
ionic2.0双击返回键退出应用
2019/09/17 Javascript
javascript 设计模式之组合模式原理与应用详解
2020/04/08 Javascript
python连接mongodb操作数据示例(mongodb数据库配置类)
2013/12/31 Python
使用PyInstaller将python转成可执行文件exe笔记
2018/05/26 Python
Python 中导入csv数据的三种方法
2018/11/01 Python
FFrpc python客户端lib使用解析
2019/08/24 Python
Pytorch技巧:DataLoader的collate_fn参数使用详解
2020/01/08 Python
Python 实现递归法解决迷宫问题的示例代码
2020/01/12 Python
通过实例解析python描述符原理作用
2020/01/22 Python
pytorch 限制GPU使用效率详解(计算效率)
2020/06/27 Python
浅谈CSS3动画的回调处理
2016/07/21 HTML / CSS
CSS3 :default伪类选择器使用简介
2018/03/15 HTML / CSS
美国五金商店:Ace Hardware
2018/03/27 全球购物
.NET remoting的两种通道是什么
2016/05/31 面试题
介绍一下EJB的体系结构
2012/08/01 面试题
一年级数学教学反思
2014/02/01 职场文书
秋天的怀念教学反思
2014/04/28 职场文书
爱国演讲稿500字
2014/05/04 职场文书
博士论文答辩开场白
2015/06/01 职场文书
离职证明格式样本
2015/06/12 职场文书
电影雨中的树观后感
2015/06/15 职场文书
2015年学校政教工作总结
2015/07/20 职场文书
Python的代理类实现,控制访问和修改属性的权限你都了解吗
2022/03/21 Python