JavaScript

超轻量级php框架startmvc

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

更新时间:2020-07-14 13:24 作者:startmvc
这篇文章主要介绍多段线实现布尔运算的方法先上代码functiongetOperatedCurves(sourceCurs:Curve[],tar

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

先上代码


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

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