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实现单继承和多继承的简单方法
Mar 29 Javascript
Javascript Object.extend
May 18 Javascript
关于使用 jBox 对话框的提交不能弹出问题解决方法
Nov 07 Javascript
用javascript关闭本窗口不弹出询问框的方法
Sep 12 Javascript
JQuery中层次选择器用法实例详解
May 18 Javascript
JS简单去除数组中重复项的方法
Sep 13 Javascript
Vue.js开发环境搭建
Nov 10 Javascript
VueJs里利用CryptoJs实现加密及解密的方法示例
Apr 29 Javascript
vue使用混入定义全局变量、函数、筛选器的实例代码
Jul 29 Javascript
JavaScript 斐波那契数列 倒序输出 输出100以内的质数代码实例
Sep 11 Javascript
浅谈微信小程序列表埋点曝光指南
Oct 15 Javascript
JS ES6异步解决方案
Apr 29 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 判断访客是否为搜索引擎蜘蛛的函数代码
2011/07/29 PHP
php利用smtp类实现电子邮件发送
2015/10/30 PHP
学习php设计模式 php实现观察者模式(Observer)
2015/12/09 PHP
PHP如何使用Memcached
2016/04/05 PHP
PHP中set_include_path()函数相关用法分析
2016/07/18 PHP
workerman结合laravel开发在线聊天应用的示例代码
2018/10/30 PHP
jquery+ashx无刷新GridView数据显示插件(实现分页、排序、过滤功能)
2010/04/25 Javascript
学习面向对象之面向对象的术语
2010/11/30 Javascript
js类定义函数时用prototype与不用的区别示例介绍
2014/06/10 Javascript
js面向对象之公有、私有、静态属性和方法详解
2015/04/17 Javascript
js获取表格的行数和列数的方法
2015/10/23 Javascript
jQuery简单实现上下,左右滑动的方法
2016/06/01 Javascript
getElementById().innerHTML与getElementById().value的区别
2016/10/27 Javascript
JavaScript动态检验密码强度的实现方法
2016/11/09 Javascript
详解如何较好的使用js
2016/12/16 Javascript
原生JS实现九宫格抽奖效果
2017/04/01 Javascript
Vuex之理解state的用法实例
2017/04/19 Javascript
vue多种弹框的弹出形式的示例代码
2017/09/18 Javascript
vue-music 使用better-scroll遇到轮播图不能自动轮播问题
2018/12/03 Javascript
Python3.7实现中控考勤机自动连接
2018/08/28 Python
Python:合并两个numpy矩阵的实现
2019/12/02 Python
英国儿童家具专卖店:GLTC
2016/09/24 全球购物
保险专业大专生求职信
2013/10/26 职场文书
简单的辞职信范文
2014/01/18 职场文书
超市国庆节促销方案
2014/02/20 职场文书
情人节寄语大全
2014/04/11 职场文书
竞选班干部演讲稿600字
2014/08/20 职场文书
2014幼儿园教师师德师风演讲稿
2014/09/10 职场文书
北大自主招生自荐信
2015/03/04 职场文书
2015年社区环境卫生工作总结
2015/04/21 职场文书
2015个人年度工作总结范文
2015/05/28 职场文书
运动会加油稿30字
2015/07/21 职场文书
校园运动会广播稿
2015/08/19 职场文书
Python爬虫基础讲解之请求
2021/05/13 Python
pytorch 实现变分自动编码器的操作
2021/05/24 Python
阿里面试Nacos配置中心交互模型是push还是pull原理解析
2022/07/23 Java/Android