From 9bfbedcc6ccace1d9a75392da31a402da2d6c3ce Mon Sep 17 00:00:00 2001 From: ChenX Date: Mon, 31 Jul 2023 18:47:38 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96:=E5=A4=9A=E6=AE=B5=E7=BA=BF?= =?UTF-8?q?=E5=81=8F=E7=A7=BB=E4=BF=9D=E6=8C=81=E7=AC=AC=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E7=82=B9=E7=9A=84=E4=BD=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../__snapshots__/seal.test.ts.snap | 30 +++++----- .../__snapshots__/offset.test.ts.snap | 26 ++++---- .../__snapshots__/offset4.test.ts.snap | 4 +- .../__snapshots__/offsetbug.test.ts.snap | 10 ++-- src/GraphicsSystem/OffsetPolyline.ts | 60 ++++++++++++++++--- 5 files changed, 87 insertions(+), 43 deletions(-) diff --git a/__test__/EdgeSealing/__snapshots__/seal.test.ts.snap b/__test__/EdgeSealing/__snapshots__/seal.test.ts.snap index 0183edb94..9783ead7e 100644 --- a/__test__/EdgeSealing/__snapshots__/seal.test.ts.snap +++ b/__test__/EdgeSealing/__snapshots__/seal.test.ts.snap @@ -62,17 +62,13 @@ Object { 0, 0, 0, - 0, 0.41421356237309503, + 0, ], "pts": Array [ - Vector2 { - "x": 239.7404845937969, - "y": 2.842170943040401e-14, - }, Vector2 { "x": 597, - "y": 8.526512829121202e-14, + "y": 1.1368683772161603e-13, }, Vector2 { "x": 597.0000000000001, @@ -92,7 +88,11 @@ Object { }, Vector2 { "x": 0, - "y": 239.74048459379705, + "y": 239.74048459379708, + }, + Vector2 { + "x": 239.74048459379694, + "y": 2.842170943040401e-14, }, ], } @@ -110,27 +110,27 @@ Array [ exports[`每段封边对应 4`] = ` Object { "buls": Array [ - 0.5761636686505207, -0, + 0.5761636686505207, -0, -0, ], "pts": Array [ Vector2 { - "x": 196.74752165480945, - "y": 0, + "x": 0, + "y": 5.684341886080802e-14, }, Vector2 { - "x": 196.74752165480942, - "y": 348, + "x": 196.74752165480933, + "y": 0, }, Vector2 { - "x": 0, - "y": 348, + "x": 196.74752165480942, + "y": 348.00000000000006, }, Vector2 { "x": 0, - "y": 0, + "y": 348.00000000000006, }, ], } diff --git a/__test__/Polyline/__snapshots__/offset.test.ts.snap b/__test__/Polyline/__snapshots__/offset.test.ts.snap index 2f1e270db..727a6abd6 100644 --- a/__test__/Polyline/__snapshots__/offset.test.ts.snap +++ b/__test__/Polyline/__snapshots__/offset.test.ts.snap @@ -50,7 +50,7 @@ exports[`圆弧如果连接就自交,需要补圆弧才能解决 2`] = `"948.214 exports[`圆弧连接后逆向 1`] = `1`; -exports[`圆弧连接后逆向 2`] = `"4159.59626"`; +exports[`圆弧连接后逆向 2`] = `"4159.59627"`; exports[`圆弧连接成圆 1`] = `7`; @@ -88,29 +88,29 @@ exports[`圆求交错误导致的线丢失 1`] = `4148.655275462343`; exports[`圆求交错误导致的线丢失 2`] = `4425.280774659384`; -exports[`圆求交错误导致的线丢失 3`] = `4021.9003160283755`; +exports[`圆求交错误导致的线丢失 3`] = `4021.900316028377`; -exports[`圆求交错误导致的线丢失 4`] = `4581.224228650708`; +exports[`圆求交错误导致的线丢失 4`] = `4581.224228650707`; exports[`圆求交错误导致的线丢失 5`] = `3900.6078808627653`; -exports[`圆求交错误导致的线丢失 6`] = `4757.468532252447`; +exports[`圆求交错误导致的线丢失 6`] = `4757.4685322524465`; exports[`圆求交错误导致的线丢失 7`] = `3783.7486269392593`; -exports[`圆求交错误导致的线丢失 8`] = `4972.012479701948`; +exports[`圆求交错误导致的线丢失 8`] = `4972.012479701949`; -exports[`圆求交错误导致的线丢失 9`] = `1148.6626298787855`; +exports[`圆求交错误导致的线丢失 9`] = `1148.6626298787853`; -exports[`圆求交错误导致的线丢失 10`] = `5979.881810920421`; +exports[`圆求交错误导致的线丢失 10`] = `5979.881810920422`; -exports[`圆求交错误导致的线丢失 11`] = `1049.959063092209`; +exports[`圆求交错误导致的线丢失 11`] = `1049.9590630922082`; exports[`圆求交错误导致的线丢失 12`] = `6051.226641876335`; exports[`圆求交错误导致的线丢失 13`] = `722.4732418587947`; -exports[`圆求交错误导致的线丢失 14`] = `6316.98088721295`; +exports[`圆求交错误导致的线丢失 14`] = `6316.980887212949`; exports[`复杂圆盘选点 1`] = `1`; @@ -176,11 +176,11 @@ exports[`点在多段线内 1`] = `1`; exports[`点在多段线内 2`] = `"1589.94630"`; -exports[`简单图形因为点在线内算法错误导致的丢失 1`] = `8.675189454805246`; +exports[`简单图形因为点在线内算法错误导致的丢失 1`] = `8.675189454805244`; exports[`简单图形因为点在线内算法错误导致的丢失 2`] = `8.252841733482933`; -exports[`简单图形因为点在线内算法错误导致的丢失 3`] = `7.149404849854285`; +exports[`简单图形因为点在线内算法错误导致的丢失 3`] = `7.1494048498542835`; exports[`简单图形因为点在线内算法错误导致的丢失 4`] = `6.693604273021893`; @@ -196,7 +196,7 @@ exports[`精度过高导致的曲线丢失 4`] = `"97661.61008"`; exports[`精度过高导致直连失败 1`] = `1`; -exports[`精度过高导致直连失败 2`] = `"32040.01391"`; +exports[`精度过高导致直连失败 2`] = `"32040.01361"`; exports[`精度过高导致直连失败 3`] = `1`; @@ -226,7 +226,7 @@ exports[`纯圆生成的多段线偏移 4`] = `"6328.57819"`; exports[`补充bug测试 1`] = `7385.123391644355`; -exports[`补充bug测试 2`] = `7455.861403941377`; +exports[`补充bug测试 2`] = `7455.861403941376`; exports[`补圆弧测试 补圆弧测试1 1`] = `1`; diff --git a/__test__/Polyline/__snapshots__/offset4.test.ts.snap b/__test__/Polyline/__snapshots__/offset4.test.ts.snap index ece61ecb3..772d875de 100644 --- a/__test__/Polyline/__snapshots__/offset4.test.ts.snap +++ b/__test__/Polyline/__snapshots__/offset4.test.ts.snap @@ -4,8 +4,8 @@ exports[`因为错误的点在多段线内部导致的偏移错误 1`] = `"2029. exports[`圆裁剪精度 1`] = `1`; -exports[`圆裁剪精度 2`] = `"8360.63312"`; +exports[`圆裁剪精度 2`] = `"8360.63303"`; exports[`圆裁剪精度 3`] = `1`; -exports[`圆裁剪精度 4`] = `"8385.98861"`; +exports[`圆裁剪精度 4`] = `"8385.98870"`; diff --git a/__test__/Polyline/__snapshots__/offsetbug.test.ts.snap b/__test__/Polyline/__snapshots__/offsetbug.test.ts.snap index 8583ebd0c..8232091e8 100644 --- a/__test__/Polyline/__snapshots__/offsetbug.test.ts.snap +++ b/__test__/Polyline/__snapshots__/offsetbug.test.ts.snap @@ -4,9 +4,9 @@ exports[`补充bug测试#IKWGF 1`] = `0.4457395323616311`; exports[`补充bug测试#IKWGF 2`] = `10.732981364094256`; -exports[`补充bug测试#IKWGF 3`] = `1.1376403544773555`; +exports[`补充bug测试#IKWGF 3`] = `1.1376403544773552`; -exports[`补充bug测试#IKWGF 4`] = `12.786911814880932`; +exports[`补充bug测试#IKWGF 4`] = `12.786911814880929`; exports[`补充bug测试#IKWGF 5`] = `10.586692094955232`; @@ -14,12 +14,12 @@ exports[`补充bug测试#IKWGF 6`] = `0.624693344084014`; exports[`补充bug测试#IKWGF 7`] = `14.067113755971711`; -exports[`补充bug测试#IKWGF 8`] = `11.89101792289923`; +exports[`补充bug测试#IKWGF 8`] = `11.891017922899252`; exports[`补充bug测试#IKWGF 9`] = `2.168984971098264`; -exports[`补充bug测试#IKWGF 10`] = `0.39474593983901435`; +exports[`补充bug测试#IKWGF 10`] = `0.3947459398390142`; -exports[`补充bug测试#IKWGF 11`] = `10.698868451254269`; +exports[`补充bug测试#IKWGF 11`] = `10.69886845125427`; exports[`补充bug测试#IKWGF 12`] = `1.0803374679586235`; diff --git a/src/GraphicsSystem/OffsetPolyline.ts b/src/GraphicsSystem/OffsetPolyline.ts index 9b388f9f3..61b9f6aaa 100644 --- a/src/GraphicsSystem/OffsetPolyline.ts +++ b/src/GraphicsSystem/OffsetPolyline.ts @@ -11,7 +11,7 @@ import { Line } from "../DatabaseServices/Entity/Line"; import { Polyline } from "../DatabaseServices/Entity/Polyline"; import { IntersectsBox } from "../Geometry/Box"; import { CurveMap, Route, Vertice } from "../Geometry/CurveMap"; -import { IdentityMtx4, SelectNearP, angle, equaln, equalv2, equalv3 } from "../Geometry/GeUtils"; +import { AsVector2, IdentityMtx4, SelectNearP, angle, equaln, equalv2, equalv3 } from "../Geometry/GeUtils"; import { IntersectOption } from "../GraphicsSystem/IntersectWith"; interface IOffsetResult @@ -684,7 +684,7 @@ export class OffsetPolyline let preP: Vector3; - let searchNext = (s: Vertice, pl: Polyline): Vertice => + let searchNext = (s: Vertice, pl: Polyline, isJoinEnd = true): Vertice => { let minDist = Infinity; let minR: Route; @@ -704,17 +704,60 @@ export class OffsetPolyline else { minR = r; + minDist = 0; break; } } - if (minR) + if (minR && Math.sqrt(minDist) < 0.085) { used.add(minR.curve); preP = minR.e; - let status = pl.Join(minR.curve, false, 8e-2); - if (status !== Status.True) - console.warn("连接失败"); + + // let status = pl.Join(minR.curve, false, 8e-2); + // if (status !== Status.True) + // console.warn("连接失败"); + + //#region fast join (为了避免Polyline.Join 导致的顺序错误) + let cu = minR.curve; + + //bul + let bul = 0; + if (cu instanceof Arc) + { + bul = cu.Bul; + if (minR.isReverse) + bul *= -1; + + if (!isJoinEnd) + bul *= -1; + } + + if (pl.LineData.length === 0) + { + pl.LineData.push({ + pt: AsVector2(minR.s), + bul: bul + }); + } + + if (isJoinEnd) + { + pl.LineData[pl.LineData.length - 1].bul = bul; + pl.LineData.push({ + pt: AsVector2(minR.e), + bul: 0 + }); + } + else + { + pl.LineData.unshift({ + pt: AsVector2(minR.e), + bul + }); + } + //#endregion + return minR.to; } }; @@ -725,10 +768,11 @@ export class OffsetPolyline let pl = new Polyline(); let ss = s; while (ss && !pl.IsClose) - ss = searchNext(ss, pl); + ss = searchNext(ss, pl, true); ss = s; + preP = pl.StartPoint; while (ss && !pl.IsClose) - ss = searchNext(ss, pl); + ss = searchNext(ss, pl, false); if (pl.NumberOfVertices > 1) {