From fe3d49474fe9128fa51730f71b0f62a2a8fa46d5 Mon Sep 17 00:00:00 2001 From: ChenX Date: Mon, 28 Jan 2019 17:36:06 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/DatabaseServices/Contour.ts | 47 ++++++++++---------------- src/GraphicsSystem/BoolOperateUtils.ts | 13 ++++--- 2 files changed, 25 insertions(+), 35 deletions(-) diff --git a/src/DatabaseServices/Contour.ts b/src/DatabaseServices/Contour.ts index 0028d2605..768f08fb8 100644 --- a/src/DatabaseServices/Contour.ts +++ b/src/DatabaseServices/Contour.ts @@ -1,6 +1,6 @@ import * as THREE from "three"; import { Vector3 } from "three"; -import { arrayRemoveDuplicateBySort } from "../Common/ArrayExt"; +import { arrayRemoveDuplicateBySort, arrayRemoveIf } from "../Common/ArrayExt"; import { curveLinkGroup, equalCurve, Vec3DTo2D } from "../Common/CurveUtils"; import { Status } from "../Common/Status"; import { FixIndex } from "../Common/Utils"; @@ -252,51 +252,40 @@ export class Contour } getSubtractList(target: Contour) { - let subtractList: Curve[] = []; - let sourceOutline = this.m_Curve; let targetOutline = target.Curve; + + if (target.CuInOutline(sourceOutline)) + return []; + let interPts = sourceOutline.IntersectWith(targetOutline, IntersectOption.OnBothOperands); let sourceContainerTarget = this.CuInOutline(targetOutline); - let targetContainerSource = target.CuInOutline(sourceOutline); //包含.相交.分离(三种状态) if (sourceContainerTarget && interPts.length === 0)//源包含目标 { - subtractList.push(sourceOutline, targetOutline); - } - else if (targetContainerSource)//目标包含源 - { - return []; + return [sourceOutline, targetOutline]; } else if (interPts.length === 0)//分离 { - subtractList.push(sourceOutline); + return [sourceOutline]; } else//相交 interPts.length > 0 { - let pars1 = interPts.map(p => sourceOutline.GetParamAtPoint(p)); - let pars2 = interPts.map(p => targetOutline.GetParamAtPoint(p)); + let subtractList: Curve[] = []; - let sourceCus: Array = sourceOutline.GetSplitCurves(pars1); - let targetCus: Array = targetOutline.GetSplitCurves(pars2); - - //是否有相等的曲线 - let hasEqualCus = false; - let equalCus: WeakSet = new WeakSet(); + let sourceCus = sourceOutline.GetSplitCurvesByPts(interPts); + let targetCus = targetOutline.GetSplitCurvesByPts(interPts); for (let pl of sourceCus) { - //有一样的曲线直接跳过 - hasEqualCus = targetCus.some(l => + let hasEqualCus = false; + arrayRemoveIf(targetCus, cu => { - if (equalCurve(pl, l)) - { - equalCus.add(l); - return true; - } - return false; + if (hasEqualCus) return false; + hasEqualCus = equalCurve(cu, pl); + return hasEqualCus; }); if (hasEqualCus) continue; @@ -309,16 +298,14 @@ export class Contour for (let pl of targetCus) { - if (equalCus.has(pl)) - continue; - if (this.CuInOutline(pl)) { subtractList.push(pl); } } + + return subtractList; } - return subtractList; } /** * 获得全部闭合曲线 diff --git a/src/GraphicsSystem/BoolOperateUtils.ts b/src/GraphicsSystem/BoolOperateUtils.ts index e55999af5..bdd27c049 100644 --- a/src/GraphicsSystem/BoolOperateUtils.ts +++ b/src/GraphicsSystem/BoolOperateUtils.ts @@ -32,11 +32,14 @@ function getIntPtContextPts(sourceCur: Curve, cu: Curve, pts: Vector3[]) if (interPts.length > 0) { let pars = interPts.map(pt => cu.GetParamAtPoint(pt)); - pars.forEach(par => + for (let par of pars) { - par >= 0.02 && pts.push(cu.GetPointAtParam(par - 0.01)); - par <= (cu.EndParam - 0.02) && pts.push(cu.GetPointAtParam(par + 0.01)); - }) + if (par >= 0.02) + pts.push(cu.GetPointAtParam(par - 0.01)); + + if (par <= (cu.EndParam - 0.02)) + pts.push(cu.GetPointAtParam(par + 0.01)); + } } } //判断点点是否全部都在封闭区域内或者在曲线上 @@ -46,7 +49,7 @@ function IsPtsAllInOrOnReg(sourceReg: Polyline | Circle | Ellipse, pts: Vector3[ { //是否点在封闭曲线内 return sourceReg.PtOnCurve(pt) || sourceReg.PtInCurve(pt); - }) + }); } //判断点是否全部都在封闭区域外或者在曲线上