JavaScript实现封闭区域布尔运算的示例代码

 更新时间:2018年06月25日 10:36:39   作者:ZoeLee  
这篇文章主要介绍了JavaScript实现封闭区域布尔运算的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

这篇文章主要介绍多段线实现布尔运算的方法

先上代码

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. 对分割后的线段进行整理,其中相交部分是曲线在对方曲线内部的部分,合并是互不在对方曲线内部的部分,相减类似不想说了,具体看代码,如果是被包含状态则更加就简单了

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • HTML+JS实现经典推箱子游戏

    HTML+JS实现经典推箱子游戏

    今天,这篇文章将利用HTML,CSS,JS的知识编写一个童年经典游戏 - 推箱子,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-11-11
  • web前端开发也需要日志

    web前端开发也需要日志

    web前端开发过程中调试是一个不可避免的过程,我们有众多的浏览器可供选择,但是如果您要调试的平台浏览器不是那么先进呢
    2010-12-12
  • firefo xml 读写实现js代码

    firefo xml 读写实现js代码

    firefo xml 读写实现 不过要是你的xml要编码成功还得在str前面加上xml头,千万别忘了啊。
    2009-06-06
  • JS 设计模式之:工厂模式定义与实现方法浅析

    JS 设计模式之:工厂模式定义与实现方法浅析

    这篇文章主要介绍了JS 设计模式之:工厂模式,结合实例形式分析了JS 工厂模式基本概念、原理、定义、实现方法与操作注意事项,需要的朋友可以参考下
    2020-05-05
  • 浅谈js中的引用和复制(传值和传址)

    浅谈js中的引用和复制(传值和传址)

    下面小编就为大家带来一篇浅谈js中的引用和复制(传值和传址)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09
  • JavaScript Rxjs mergeMap 的使用场合

    JavaScript Rxjs mergeMap 的使用场合

    这篇文章主要介绍了JavaScript Rxjs mergeMap 的使用场合,mergeMap 接收一个函数作为输入参数,这个函数的输入参数就是通过 pipe 链接 mergeMap 的 Observable 里包含的元素
    2022-07-07
  • JS简单实现表格排序功能示例

    JS简单实现表格排序功能示例

    这篇文章主要介绍了JS简单实现表格排序功能,涉及javascript针对页面元素的遍历、判断与排序相关操作技巧,需要的朋友可以参考下
    2016-12-12
  • 在JavaScript中终止forEach循环的三种方式

    在JavaScript中终止forEach循环的三种方式

    如何终止forEach循环这个问题估计会难倒一部分同学,甚至会有人反问,forEach循环在JavaScript中能终止吗?本文小编给大家介绍了三种方式可以终止forEach循环,需要的朋友可以参考下
    2023-11-11
  • JavaScript 函数用法详解【函数定义、参数、绑定、作用域、闭包等】

    JavaScript 函数用法详解【函数定义、参数、绑定、作用域、闭包等】

    这篇文章主要介绍了JavaScript 函数用法,结合实例形式分析了JavaScript函数定义、参数、绑定、作用域、闭包、回调函数、柯理化函数等相关概念、原理与操作注意事项,需要的朋友可以参考下
    2020-05-05
  • javascript学习网址备忘

    javascript学习网址备忘

    javascript学习网址备忘...
    2007-05-05

最新评论