From be67519e0b114f2a9cd2b922880178758d560423 Mon Sep 17 00:00:00 2001 From: ChenX Date: Sun, 27 Jan 2019 11:33:55 +0800 Subject: [PATCH] =?UTF-8?q?=E9=99=8D=E4=BD=8E=E7=B2=BE=E5=BA=A6,=E4=BF=9D?= =?UTF-8?q?=E8=AF=81=E9=9D=A2=E5=9F=9F=E5=B8=83=E5=B0=94=E8=83=BD=E5=A4=9F?= =?UTF-8?q?=E5=BE=97=E5=88=B0=E6=AD=A3=E5=B8=B8=E7=9A=84=E7=BB=93=E6=9E=9C?= =?UTF-8?q?,=E6=B5=8B=E8=AF=95=E5=85=A8=E9=83=A8=E9=80=9A=E8=BF=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __test__/Booloperate/bool2.test.ts | 9 +++++++-- __test__/Polyline/__snapshots__/offset.test.ts.snap | 2 +- src/Common/CurveUtils.ts | 7 ++++--- src/Common/Matrix4Utils.ts | 4 +--- src/DatabaseServices/Contour.ts | 6 +++--- src/DatabaseServices/Curve.ts | 8 ++++---- src/Geometry/CurveMap.ts | 2 +- 7 files changed, 21 insertions(+), 17 deletions(-) diff --git a/__test__/Booloperate/bool2.test.ts b/__test__/Booloperate/bool2.test.ts index 895bef9bb..d96f93d6b 100644 --- a/__test__/Booloperate/bool2.test.ts +++ b/__test__/Booloperate/bool2.test.ts @@ -9,6 +9,11 @@ test("#IRFL2面域消失", () => let regs: Region[] = LoadRegionsFromFileData(data); expect(regs.length).toBe(2); - regs[0].BooleanOper(regs[1], BoolOpeartionType.Intersection); - expect(regs[0].ShapeManager.ShapeList.length).toBe(2); + let reg = regs[0].Clone(); + reg.BooleanOper(regs[1], BoolOpeartionType.Subtract); + expect(reg.ShapeManager.ShapeList.length).toBe(2); + + reg = regs[0].Clone(); + reg.BooleanOper(regs[1], BoolOpeartionType.Intersection); + expect(reg.ShapeManager.ShapeList.length).toBe(1); }); diff --git a/__test__/Polyline/__snapshots__/offset.test.ts.snap b/__test__/Polyline/__snapshots__/offset.test.ts.snap index caed51f96..9dbd5d96f 100644 --- a/__test__/Polyline/__snapshots__/offset.test.ts.snap +++ b/__test__/Polyline/__snapshots__/offset.test.ts.snap @@ -30,7 +30,7 @@ exports[`圆求交错误导致的线丢失 6`] = `4757.46853225238`; exports[`圆求交错误导致的线丢失 7`] = `3783.74866210012`; -exports[`圆求交错误导致的线丢失 8`] = `4972.0124797018525`; +exports[`圆求交错误导致的线丢失 8`] = `4972.012479701851`; exports[`圆求交错误导致的线丢失 9`] = `1148.6632687596896`; diff --git a/src/Common/CurveUtils.ts b/src/Common/CurveUtils.ts index 6a4ffc9ac..68fd6d770 100644 --- a/src/Common/CurveUtils.ts +++ b/src/Common/CurveUtils.ts @@ -192,12 +192,12 @@ export function equalCurve(cu1: Curve, cu2: Curve) let buls1 = ptsBuls1.buls; let buls2 = ptsBuls2.buls; - if (cu1.IsClose && equalv2(pts1[0], arrayLast(pts1))) + if (cu1.IsClose && equalv2(pts1[0], arrayLast(pts1), 1e-6)) { pts1.pop(); buls1.pop(); } - if (cu2.IsClose && equalv2(pts2[0], arrayLast(pts2))) + if (cu2.IsClose && equalv2(pts2[0], arrayLast(pts2), 1e-6)) { pts2.pop(); buls2.pop(); @@ -211,7 +211,8 @@ export function equalCurve(cu1: Curve, cu2: Curve) equalArray(pts1, pts2, (p1: Vector2, p2: Vector2) => equalv3( Vec2DTo3D(p1).applyMatrix4(cu1.OCS), - Vec2DTo3D(p2).applyMatrix4(cu2.OCS) + Vec2DTo3D(p2).applyMatrix4(cu2.OCS), + 1e-4 ) ); } diff --git a/src/Common/Matrix4Utils.ts b/src/Common/Matrix4Utils.ts index 4d9f2a180..c064f79cd 100644 --- a/src/Common/Matrix4Utils.ts +++ b/src/Common/Matrix4Utils.ts @@ -29,9 +29,7 @@ export function matrixSetVector(mat: Matrix4, col: number, v: Vector3) */ export function matrixAlignCoordSys(matrixFrom: Matrix4, matrixTo: Matrix4): Matrix4 { - let matrix = new Matrix4().getInverse(matrixTo); - - return new Matrix4().multiplyMatrices(matrix, matrixFrom); + return new Matrix4().getInverse(matrixTo).multiply(matrixFrom); } /** diff --git a/src/DatabaseServices/Contour.ts b/src/DatabaseServices/Contour.ts index 7083a5f61..5ffa2e4ad 100644 --- a/src/DatabaseServices/Contour.ts +++ b/src/DatabaseServices/Contour.ts @@ -1,6 +1,8 @@ import * as THREE from "three"; import { Vector3 } from "three"; +import { arrayRemoveDuplicateBySort } from "../Common/ArrayExt"; import { curveLinkGroup, equalCurve, Vec3DTo2D } from "../Common/CurveUtils"; +import { Status } from "../Common/Status"; import { FixIndex } from "../Common/Utils"; import { equaln, rotatePoint } from "../Geometry/GeUtils"; import { RegionParse, Route } from "../Geometry/RegionParse"; @@ -10,8 +12,6 @@ import { Arc } from "./Arc"; import { Circle } from "./Circle"; import { Curve } from "./Curve"; import { Polyline } from "./Polyline"; -import { arrayRemoveDuplicateBySort } from "../Common/ArrayExt"; -import { Status } from "../Common/Status"; let cache = new WeakMap(); @@ -359,7 +359,7 @@ export class Contour else { if (cache.has(g)) - return cache.get(g) + return cache.get(g); let pl = new Polyline(); diff --git a/src/DatabaseServices/Curve.ts b/src/DatabaseServices/Curve.ts index 862ebea43..9bb5a90eb 100644 --- a/src/DatabaseServices/Curve.ts +++ b/src/DatabaseServices/Curve.ts @@ -128,17 +128,17 @@ export abstract class Curve extends Entity //点在曲线上 PtOnCurve(pt: Vector3): boolean { - return equalv3(this.StartPoint, pt, 1e-12) || equalv3(this.EndPoint, pt, 1e-12) || this.ParamOnCurve(this.GetParamAtPoint(pt)); + return equalv3(this.StartPoint, pt, 1e-6) || equalv3(this.EndPoint, pt, 1e-6) || this.ParamOnCurve(this.GetParamAtPoint(pt)); } //点在曲线中,不在起点或者终点. PtOnCurve2(pt: Vector3): boolean { - return !(equalv3(this.StartPoint, pt, 1e-12) || equalv3(this.EndPoint, pt, 1e-12)) && this.ParamOnCurve(this.GetParamAtPoint(pt), 0); + return !(equalv3(this.StartPoint, pt, 1e-6) || equalv3(this.EndPoint, pt, 1e-6)) && this.ParamOnCurve(this.GetParamAtPoint(pt), 0); } - //参数在曲线上 容差,1e-12 - ParamOnCurve(param: number, fuzz = 1e-12): boolean { return !isNaN(param) && param >= -fuzz && param <= this.EndParam + fuzz; } + //参数在曲线上 容差,1e-6 + ParamOnCurve(param: number, fuzz = 1e-6): boolean { return !isNaN(param) && param >= -fuzz && param <= this.EndParam + fuzz; } GetOffsetCurves(offsetDist: number): Array { return; } GetClosestPointTo(pt: Vector3, extend: boolean): Vector3 { return; } diff --git a/src/Geometry/CurveMap.ts b/src/Geometry/CurveMap.ts index d88168259..ee01d7474 100644 --- a/src/Geometry/CurveMap.ts +++ b/src/Geometry/CurveMap.ts @@ -73,7 +73,7 @@ export class CurveMap */ private GenerateP(v: Vector3): Vector3 { - let str = v.toArray().map(v => ToFixed(v)).join(","); + let str = v.toArray().map(v => ToFixed(v, 4)).join(","); if (this.m_vecMap.has(str)) return this.m_vecMap.get(str); this.m_vecMap.set(str, v);