From 7307eaae5e29ba00968080363553af56c8b28858 Mon Sep 17 00:00:00 2001 From: ZoeLeeFZ Date: Thu, 20 Dec 2018 16:04:57 +0800 Subject: [PATCH] =?UTF-8?q?!223=20=E5=B9=B6=E9=9B=86=E5=85=B1=E7=BA=BF?= =?UTF-8?q?=E7=BA=BF=E6=AE=B5=E8=BF=9E=E6=8E=A5=20Merge=20pull=20request?= =?UTF-8?q?=20!223=20from=20ZoeLeeFZ/fixUnion?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/DatabaseServices/Contour.ts | 55 +++++++++++++++---- .../SpaceParse/SurroundOutlineParse.ts | 11 ---- 2 files changed, 45 insertions(+), 21 deletions(-) diff --git a/src/DatabaseServices/Contour.ts b/src/DatabaseServices/Contour.ts index 30a8fb6db..cff81be9b 100644 --- a/src/DatabaseServices/Contour.ts +++ b/src/DatabaseServices/Contour.ts @@ -8,13 +8,14 @@ import { Circle } from "./Circle"; import { Curve } from "./Curve"; import { Polyline } from "./Polyline"; import { Vector3 } from "three"; +import { FixIndex } from "../Common/Utils"; export class Contour { private m_Curve: Polyline | Circle; - static CreateContour(cus: Curve[]) + static CreateContour(cus: Curve[], needLink = true) { - let closeCurve = Contour.Combine(cus) as Polyline | Circle; + let closeCurve = Contour.Combine(cus, needLink) as Polyline | Circle; if (closeCurve && closeCurve.IsClose) { if (closeCurve instanceof Polyline && closeCurve.CloseMark === false) @@ -82,7 +83,31 @@ export class Contour UnionBoolOperation(target: Contour): Contour[] { let resultCus = this.getOperatedCurves(target); - return Contour.GetAllContour(resultCus.unionList); + //并集后的线段表如果有共线的直接合并起来 + let cus: Curve[] = []; + for (let pl of resultCus.unionList) + { + if (pl instanceof Polyline) + cus.push(...pl.Explode()); + else + cus.push(pl); + } + let cuGroups = curveLinkGroup(cus); + for (let g of cuGroups) + { + for (let i = 0; i < g.length; i++) + { + let c1 = g[i]; + let nextI = FixIndex(i + 1, g); + let c2 = g[nextI]; + if (c1.Join(c2)) + { + g.splice(nextI, 1); + i--; + } + } + } + return Contour.GetAllContour(cuGroups); } //差集:等于0完全被减去 SubstactBoolOperation(target: Contour): Contour[] @@ -193,16 +218,26 @@ export class Contour return { intersectionList, unionList, subtractList }; } - //获得所有闭合的轮廓. - static GetAllContour(cus: Curve[]) + /** + * 获得全部闭合曲线 + * @若传入二维曲线数据,将默认子数组为闭合曲线段 + */ + static GetAllContour(cus: Curve[] | Curve[][]): Contour[] { - let cuGroups = curveLinkGroup(cus); + if (cus.length === 0) + return []; + + let cuGroups: Curve[][]; + if (Array.isArray(cus[0])) + cuGroups = cus as Curve[][]; + else + cuGroups = curveLinkGroup(cus as Curve[]); let contours: Contour[] = [] - cuGroups.forEach(cus => + cuGroups.forEach(c => { - contours.push(Contour.CreateContour(cus)); + contours.push(Contour.CreateContour(c, false)); }) return contours.filter(c => c !== undefined && !equaln(c.Area, 0, 1e-6)); } @@ -213,11 +248,11 @@ export class Contour * @returns * @memberof Polyline */ - static Combine(cus: Curve[]): Curve + static Combine(cus: Curve[], needLink = true): Curve { if (cus.length === 0) return undefined; - let groups = curveLinkGroup(cus); + let groups = needLink ? curveLinkGroup(cus) : [cus]; let joinCus: Curve[] = []; diff --git a/src/Geometry/SpaceParse/SurroundOutlineParse.ts b/src/Geometry/SpaceParse/SurroundOutlineParse.ts index 410fe7519..5088be55a 100644 --- a/src/Geometry/SpaceParse/SurroundOutlineParse.ts +++ b/src/Geometry/SpaceParse/SurroundOutlineParse.ts @@ -47,17 +47,6 @@ export class SurroundOutlineParse extends ISpaceParse for (let pl of pls) { let cus = pl.Explode().filter(cu => !equaln(cu.Length, 0, 1e-6)); - for (let i = 0; i < cus.length; i++) - { - let c1 = cus[i]; - let nextI = FixIndex(i + 1, cus); - let c2 = cus[nextI]; - if (c1.Join(c2)) - { - cus.splice(nextI, 1); - i--; - } - } this.m_Outlines.push(...cus); } }