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 相关文章推荐
Extjs学习笔记之七 布局
Jan 08 Javascript
基于Jquery+Ajax+Json的高效分页实现代码
Oct 29 Javascript
学习javascript的闭包,原型,和匿名函数之旅
Oct 18 Javascript
javascript伸缩菜单栏实现代码分享
Nov 12 Javascript
使用JavaScript脚本判断页面是否在微信中被打开
Mar 06 Javascript
JS中判断null的方法分析
Nov 21 Javascript
BootStrap实现响应式布局导航栏折叠隐藏效果(在小屏幕、手机屏幕浏览时自动折叠隐藏)
Nov 30 Javascript
详解jQuery选择器
Dec 21 Javascript
原生js实现仿window10系统日历效果的实例
Oct 31 Javascript
浅谈Angularjs中不同类型的双向数据绑定
Jul 16 Javascript
angular的输入和输出的使用方法
Sep 22 Javascript
vue实现锚点定位功能
Jun 29 Vue.js
详解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
2019年中国咖啡业现状与发展趋势
2021/03/04 咖啡文化
PHP读取文本文件并逐行输出该行使用最多的字符与对应次数的方法
2016/11/25 PHP
基于PHP常用文件函数和目录函数整理
2017/08/17 PHP
jQuery在iframe中无法弹出对话框的解决方法
2014/01/12 Javascript
基于socket.io和node.js搭建即时通信系统
2014/07/30 Javascript
jQuery解决IE6、7、8不能使用 JSON.stringify 函数的问题
2016/05/31 Javascript
AngularJS基础 ng-init 指令简单示例
2016/08/02 Javascript
Javascript 实现全屏滚动实例代码
2016/12/31 Javascript
JavaScript for循环 if判断语句(学习笔记)
2017/10/11 Javascript
layui.js实现的表单验证功能示例
2017/11/15 Javascript
微信小程序使用modal组件弹出对话框功能示例
2017/11/29 Javascript
在 React、Vue项目中使用SVG的方法
2018/02/09 Javascript
在vue项目中引入高德地图及其UI组件的方法
2018/09/04 Javascript
vue实现一个炫酷的日历组件
2018/10/08 Javascript
在Create React App中启用Sass和Less的方法示例
2019/01/16 Javascript
Node.js API详解之 dgram模块用法实例分析
2020/06/05 Javascript
python中xrange和range的区别
2014/05/13 Python
numpy实现合并多维矩阵、list的扩展方法
2018/05/08 Python
Django管理员账号和密码忘记的完美解决方法
2018/12/06 Python
Python实现html转换为pdf报告(生成pdf报告)功能示例
2019/05/04 Python
Python实现操纵控制windows注册表的方法分析
2019/05/24 Python
python打开使用的方法
2019/09/30 Python
python实现视频压缩功能
2020/12/18 Python
CSS3图片旋转特效(360/60/-360度)
2013/10/10 HTML / CSS
Perry Ellis官网:美国男士品味服装
2016/12/09 全球购物
请用Python写一个获取用户输入数字,并根据数字大小输出不同信息的脚本
2014/05/20 面试题
这76道Java面试题及答案,祝你能成功通过面试
2016/04/16 面试题
个人自我鉴定怎么写
2013/10/28 职场文书
毕业自荐书
2013/12/09 职场文书
农村文化建设标语
2014/10/07 职场文书
2014年教育工作总结
2014/11/26 职场文书
后天观后感
2015/06/08 职场文书
骆驼祥子读书笔记
2015/06/26 职场文书
上级领导检查欢迎词
2015/09/30 职场文书
调研报告的主要写法
2019/04/18 职场文书
导游词创作书写原则以及开场白技巧怎么学?
2019/09/25 职场文书