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模拟实现Array的sort方法
Dec 11 Javascript
JavaScript代码应该放在HTML代码哪个位置比较好?
Oct 16 Javascript
jQuery qrcode生成二维码的方法
Apr 03 Javascript
Easyui Treegrid改变默认图标的方法
Apr 29 Javascript
微信小程序  modal弹框组件详解
Oct 27 Javascript
js 判断数据类型的几种方法
Jan 13 Javascript
在React中如何优雅的处理事件响应详解
Jul 24 Javascript
vue多种弹框的弹出形式的示例代码
Sep 18 Javascript
Vue2.0 axios前后端登陆拦截器(实例讲解)
Oct 27 Javascript
详解element-ui设置下拉选择切换必填和非必填
Jun 17 Javascript
Vue的自定义组件不能使用click方法的解决
Jul 28 Javascript
vue-cli 关闭热更新操作
Sep 18 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
关于查看MSSQL 数据库 用户每个表 占用的空间大小
2013/06/21 PHP
php按百分比生成缩略图的代码分享
2014/05/10 PHP
PHP新特性之字节码缓存和内置服务器
2017/08/11 PHP
javaScript 数值型和字符串型之间的转换
2009/07/25 Javascript
Javascript拓展String方法小结
2013/07/08 Javascript
js实现动态加载脚本的方法实例汇总
2015/11/02 Javascript
JavaScript仿商城实现图片广告轮播实例代码
2016/02/06 Javascript
JS Array创建及concat()split()slice()的使用方法
2016/06/03 Javascript
浅谈js的解析顺序 作用域 严格模式
2017/10/23 Javascript
JavaScript折半查找(二分查找)算法原理与实现方法示例
2018/08/06 Javascript
vue2.x 对象劫持的原理实现
2020/04/19 Javascript
[07:20]2014DOTA2西雅图国际邀请赛 选手讲解积分赛第二天
2014/07/11 DOTA
Python自动重试HTTP连接装饰器
2015/04/28 Python
详解python中executemany和序列的使用方法
2017/08/12 Python
对python中词典的values值的修改或新增KEY详解
2019/01/20 Python
pytorch使用Variable实现线性回归
2019/05/21 Python
python实现的读取网页并分词功能示例
2019/10/29 Python
python GUI库图形界面开发之PyQt5中QMainWindow, QWidget以及QDialog的区别和选择
2020/02/26 Python
css3实现图片遮罩效果鼠标hover以后出现文字
2013/11/05 HTML / CSS
用纯css3实现的图片放大镜特效效果非常不错
2014/09/02 HTML / CSS
Agoda台湾官网:国内外订房2折起
2018/03/20 全球购物
办公室文秘自我鉴定
2013/09/21 职场文书
青年文明号复核材料
2014/02/11 职场文书
企业后勤岗位职责
2014/02/28 职场文书
政治思想表现评语
2014/05/04 职场文书
高中学校对照检查材料
2014/08/31 职场文书
个人公司授权委托书范本
2014/10/12 职场文书
优秀学生干部事迹材料
2014/12/24 职场文书
幼儿园教师考核评语
2014/12/31 职场文书
专业技术人员年度考核评语
2014/12/31 职场文书
长城导游词400字
2015/01/30 职场文书
项目经理岗位职责
2015/01/31 职场文书
《曹冲称象》教学反思
2016/02/20 职场文书
签证扫盲贴,41个常见签证知识,需要的拿走
2019/08/09 职场文书
小程序后台PHP版本部署运行 LNMP+WNMP
2021/04/01 Servers
MySQL索引 高效获取数据的数据结构
2022/05/02 MySQL