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 相关文章推荐
再次更新!MSClass (Class Of Marquee Scroll通用不间断滚动JS封装类 Ver 1.6)
Feb 05 Javascript
JavaScript EasyPager 分页函数
May 25 Javascript
Jquery和JS用外部变量获取Ajax返回的参数值的方法实例(超简单)
Jun 17 Javascript
javascript图片相似度算法实现 js实现直方图和向量算法
Jan 14 Javascript
JS使用ajax方法获取指定url的head信息中指定字段值的方法
Mar 24 Javascript
JavaScript每天定时更换皮肤样式的方法
Jul 01 Javascript
js获取鼠标位置实例详解
Dec 09 Javascript
如何用js实现鼠标向上滚动时浮动导航
Jul 18 Javascript
一道面试题引发的对javascript类型转换的思考
Mar 06 Javascript
JavaScript比较同一天的时间大小实例代码
Feb 09 Javascript
微信小程序url传参写变量的方法
Aug 09 Javascript
微信小程序网络请求实现过程解析
Nov 06 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过滤★等特殊符号的正则
2014/01/27 PHP
PHP7多线程搭建教程
2017/04/21 PHP
PHP的mysqli_sqlstate()函数讲解
2019/01/23 PHP
jquery cookie的用法总结
2013/11/18 Javascript
JS实现定时自动关闭DIV层提示框的方法
2015/05/11 Javascript
基于jQuery实现文本框只能输入数字(小数、整数)
2016/01/14 Javascript
JS控制弹出悬浮窗口(一览画面)的实例代码
2016/05/30 Javascript
最全面的JS倒计时代码
2016/09/17 Javascript
利用jquery禁止外层滚动条的滚动
2017/01/05 Javascript
jQuery输入框密码的显示隐藏【代码分享】
2017/04/29 jQuery
JavaScript使用readAsDataURL读取图像文件
2017/05/10 Javascript
微信小程序 es6-promise.js封装请求与处理异步进程
2017/06/12 Javascript
解决option标签selected=&quot;selected&quot;属性失效的问题
2017/11/06 Javascript
vue中倒计时组件的实例代码
2018/07/06 Javascript
Makefile/cmake/node-gyp中区分判断不同平台的方法
2018/12/18 Javascript
vue cli3.0打包上线静态资源找不到路径的解决操作
2020/08/03 Javascript
以911新闻为例演示Python实现数据可视化的教程
2015/04/23 Python
Python简单基础小程序的实例代码
2019/04/28 Python
Python玩转加密的技巧【推荐】
2019/05/13 Python
Python类中方法getitem和getattr详解
2019/08/30 Python
Django REST框架创建一个简单的Api实例讲解
2019/11/05 Python
Python列表去重复项的N种方法(实例代码)
2020/05/12 Python
Html5大文件断点续传实现方法
2015/12/05 HTML / CSS
万得城电器土耳其网站:欧洲第一大电子产品零售商
2016/10/07 全球购物
在加拿大在线租赁和购买电子游戏:Game Access
2019/09/02 全球购物
德国在线购买葡萄酒网站:Geile Weine
2019/09/24 全球购物
大学旷课检讨书
2014/01/28 职场文书
我的梦中国梦演讲稿
2014/04/23 职场文书
大学生求职信范文
2014/05/24 职场文书
学校社会实践活动总结
2014/07/03 职场文书
企业优秀团员事迹材料
2014/08/20 职场文书
教师学习三严三实心得体会
2014/10/13 职场文书
研究生给导师的自荐信
2015/03/06 职场文书
简爱读书笔记
2015/06/26 职场文书
读完《骆驼祥子》的观后感!
2019/07/05 职场文书
HTML常用标签超详细整理
2022/03/19 HTML / CSS