From 719dbbf6dfcab3dce0f27b68426f5c1876779b37 Mon Sep 17 00:00:00 2001 From: ChenX Date: Wed, 14 Jun 2023 18:14:31 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D:=E8=BD=AE=E5=BB=93=E5=81=8F?= =?UTF-8?q?=E7=A7=BB=E5=A4=B1=E8=B4=A5=20fix=20#I7CTIO?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../__snapshots__/offset4.test.ts.snap | 2 ++ __test__/Polyline/offset.test.ts | 11 ++++-- __test__/Polyline/offset4.test.ts | 36 +++++++++++++++++++ src/DatabaseServices/PointInPolyline.ts | 8 ++--- 4 files changed, 51 insertions(+), 6 deletions(-) diff --git a/__test__/Polyline/__snapshots__/offset4.test.ts.snap b/__test__/Polyline/__snapshots__/offset4.test.ts.snap index f2949b6b5..f83b0dd83 100644 --- a/__test__/Polyline/__snapshots__/offset4.test.ts.snap +++ b/__test__/Polyline/__snapshots__/offset4.test.ts.snap @@ -1,5 +1,7 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`因为错误的点在多段线内部导致的偏移错误 1`] = `"2029.61915"`; + exports[`圆裁剪精度 1`] = `1`; exports[`圆裁剪精度 2`] = `"8360.62214"`; diff --git a/__test__/Polyline/offset.test.ts b/__test__/Polyline/offset.test.ts index f8cdf25e5..5098caddc 100644 --- a/__test__/Polyline/offset.test.ts +++ b/__test__/Polyline/offset.test.ts @@ -1,9 +1,9 @@ import { Factory } from "../../src/DatabaseServices/CADFactory"; import { Curve } from "../../src/DatabaseServices/Entity/Curve"; import { Polyline } from "../../src/DatabaseServices/Entity/Polyline"; -import { LoadEntityFromFileData } from "../Utils/LoadEntity.util"; -import "../Utils/jest.util"; import { OffsetPolyline } from "../../src/GraphicsSystem/OffsetPolyline"; +import "../Utils/jest.util"; +import { LoadEntityFromFileData } from "../Utils/LoadEntity.util"; Factory(Polyline); @@ -1089,3 +1089,10 @@ test('精度问题导致的连接错误', () => )[0]; testOffset(pl, 2.4254); }); + +test('偏移连接失败', () => +{ + let d = + { "file": [1, "Polyline", 10, 2, 111, 0, 1, 7, 0, [1, 0, 0, 0, 0, 2.220446049250313e-16, 1, 0, 0, -1, 2.220446049250313e-16, 0, 3448.9478393627373, 588.8818635607608, 2277.4901004968165, 1], 0, 0, 1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 0, 1, 2, 5, [0, 0], 0.27588288158564067, [-68.01871597353602, 76.74348620727369], 0.1548304020399718, [-904.2903739294561, 76.74348340440201], 0.27588268439117536, [-972.3091079030273, -0.00014195760331858764], 0, [-9.094947017729282e-13, 4.547473508864641e-13], 0, false], "basePt": { "x": 2476.63873145971, "y": 588.8818635607608, "z": 2277.489958539213 }, "ucs": [1, 0, 0, 0, 0, 0, 1, 0, 0, -1, 0, 0, 610.4825291181364, 588.8818635607321, 0, 1] }; + +}); diff --git a/__test__/Polyline/offset4.test.ts b/__test__/Polyline/offset4.test.ts index 5e8a0eb6f..68e2b4681 100644 --- a/__test__/Polyline/offset4.test.ts +++ b/__test__/Polyline/offset4.test.ts @@ -1,3 +1,5 @@ +import { Vector3 } from "three"; +import { CADFiler } from "../../src/DatabaseServices/CADFiler"; import { Polyline } from "../../src/DatabaseServices/Entity/Polyline"; import "../Utils/jest.util"; import { LoadCurvesFromFileData } from "../Utils/LoadEntity.util"; @@ -18,3 +20,37 @@ test('圆裁剪精度', () => expect(c.Length).toMatchNumberSnapshot(); } }); + +test("错误的点在多段线内部", () => +{ + let d = ["Polyline", 10, 2, 0, 0, 0, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 0, 1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 0, 1, 2, 5, [-903.9879626621178, 75.79030586302474], -0.1548304020399718, [-68.32112723448535, 75.79030866386893], 0, [-68.01871597353619, 76.74348620727369], 0.1548304020399718, [-904.2903739294563, 76.74348340440224], 0, [-903.9879626621178, 75.79030586302474], 0, false, -486.15450978803466, 140.48362331381213, 0]; + let f = new CADFiler(d); + let pl = f.ReadObject() as Polyline; + let p = new Vector3(f.Read(), f.Read(), f.Read()); + expect(pl.PtInCurve(p)).toBeFalsy(); +}); + +test('错误的点在多段线内部2', () => +{ + let d = + ["Polyline", 10, 2, 108, 0, 1, 7, 71, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -438.1577281907905, 358.23373269662113, 0, 1], 0, 0, 1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 0, 1, 2, 3, [0, 0], 0.9999999999999999, [-58.58109281699865, 0], -0.7547474747474747, [0, 0], 0, false, -467.44827459928985, 380.3406986324097, 0]; + let f = new CADFiler(d); + let pl = f.ReadObject() as Polyline; + let p = new Vector3(f.Read(), f.Read(), f.Read()); + expect(pl.PtInCurve(p)).toBeFalsy(); +}); + +test('因为错误的点在多段线内部导致的偏移错误', () => +{ + + let d = + { "file": [1, "Polyline", 10, 2, 111, 0, 1, 7, 0, [1, 0, 0, 0, 0, 2.220446049250313e-16, 1, 0, 0, -1, 2.220446049250313e-16, 0, 3448.9478393627373, 588.8818635607608, 2277.4901004968165, 1], 0, 0, 1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 0, 1, 2, 5, [0, 0], 0.27588288158564067, [-68.01871597353602, 76.74348620727369], 0.1548304020399718, [-904.2903739294561, 76.74348340440201], 0.27588268439117536, [-972.3091079030273, -0.00014195760331858764], 0, [-9.094947017729282e-13, 4.547473508864641e-13], 0, false], "basePt": { "x": 2476.63873145971, "y": 588.8818635607608, "z": 2277.489958539213 }, "ucs": [1, 0, 0, 0, 0, 0, 1, 0, 0, -1, 0, 0, 610.4825291181364, 588.8818635607321, 0, 1] }; + let f = new CADFiler(d.file); + + f.Read(); + let el1 = f.ReadObject() as Polyline; + + let pls = el1.GetOffsetCurves(-1); + for (let pl of pls) + expect(pl.Length).toMatchNumberSnapshot(); +}); diff --git a/src/DatabaseServices/PointInPolyline.ts b/src/DatabaseServices/PointInPolyline.ts index 05f98ae28..515366a95 100644 --- a/src/DatabaseServices/PointInPolyline.ts +++ b/src/DatabaseServices/PointInPolyline.ts @@ -128,13 +128,13 @@ export function IsPointInPolyLine(pl: Polyline, pt: Vector3): boolean } if (equaln(sp.x, pt.x) && sp.y > pt.y) { - let der = arc.GetFistDeriv(0); + let der = arc.GetFistDeriv(0).normalize(); if (der.x < -1e-5) crossings++; } if (equaln(ep.x, pt.x) && ep.y > pt.y) { - let der = arc.GetFistDeriv(1); + let der = arc.GetFistDeriv(1).normalize(); if (der.x > 1e-5) crossings++; } @@ -144,8 +144,8 @@ export function IsPointInPolyLine(pl: Polyline, pt: Vector3): boolean if (pti.y < pt.y || equalv3(sp, pti, 1e-5) || equalv3(ep, pti, 1e-5)) continue; - let der = arc.GetFistDeriv(pti); - if (!equaln(der.x, 0)) //相切. + let der = arc.GetFistDeriv(pti).normalize(); + if (!equaln(der.y, 0, 1e-5)) //相切. crossings++; } }