From 200c5ee2fd3eabb661ba4c25a8da50d1a3c95c45 Mon Sep 17 00:00:00 2001 From: Zoe Date: Fri, 22 Jun 2018 17:29:17 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=85=B1=E7=BA=BF=E6=97=B6?= =?UTF-8?q?=E5=81=8F=E7=A7=BBbug,=E6=BB=A1=E6=B5=8B=E8=AF=95=E8=A6=86?= =?UTF-8?q?=E7=9B=96=E7=8E=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __test__/Polyline/offset.test.ts | 114 ++++++++++++++++----------- src/Add-on/test/testIntersect.ts | 2 +- src/Add-on/testEntity/TestCurve.ts | 2 +- src/GraphicsSystem/IntersectWith.ts | 4 +- src/GraphicsSystem/OffsetPolyline.ts | 79 +++++++++---------- 5 files changed, 107 insertions(+), 94 deletions(-) diff --git a/__test__/Polyline/offset.test.ts b/__test__/Polyline/offset.test.ts index e0295fae1..af2966470 100644 --- a/__test__/Polyline/offset.test.ts +++ b/__test__/Polyline/offset.test.ts @@ -63,16 +63,15 @@ describe("闭合多段线", () => let data = [1, ["Polyline", 1, 1, 3, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 4, [6.059716713881022, 3.983456090651555], 1.1217395195062214, [6.383002832861191, 4.064022662889515], 0, [4.929178470254959, 8.399433427762037], 1.2642365052895204, [5.750708215297452, 4.050991501416427], 0.7171789779484218, true]] let cus = loadFile(data); - for (let i = 0.5; i < 10; i += 0.5) + for (let i = 1; i < 10; i += 1) { expect(cus[0].GetOffsetCurves(i).length).toBe(1); } - for (let i = -1.5; i < 0; i += 0.01) + for (let i = -0.5; i < -0.15; i += 0.05) { - if (cus[0].GetOffsetCurves(i).length === 0) console.log(i); expect(cus[0].GetOffsetCurves(i).length).toBe(1); } - for (let i = 2; i < 10; i += 1) + for (let i = 2; i < 10; i += 2) { expect(cus[0].GetOffsetCurves(-i).length).toBe(0); } @@ -85,19 +84,19 @@ describe("闭合多段线", () => let cus = loadFile(data); expect(cus[0].GetOffsetCurves(-0.1799).length).toBe(2); - for (let i = 0.2; i < 10; i += 1) + for (let i = 0.2; i < 10; i += 2) { expect(cus[0].GetOffsetCurves(i).length).toBe(1); } - for (let i = -0.17; i < 0; i += 0.01) + for (let i = -0.17; i < 0; i += 0.03) { expect(cus[0].GetOffsetCurves(i).length).toBe(1); } - for (let i = -0.18; i < -0.34; i -= 0.01) + for (let i = -0.2; i > -0.34; i -= 0.02) { expect(cus[0].GetOffsetCurves(i).length).toBe(1); } - for (let i = 0.35; i < 3; i += 0.01) + for (let i = 0.35; i < 0.5; i += 0.05) { expect(cus[0].GetOffsetCurves(-i).length).toBe(0); } @@ -126,22 +125,22 @@ describe("闭合多段线", () => let data = [1, ["Polyline", 1, 1, 1453, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 5, [17.138593827490823, 4.9429359111242475], 0.6262511063576436, [18.12066066115083, 4.8347623552068075], 0, [18.12066066115083, 10.450468898178228], 0, [16.250318720818097, 10.450468898178228], 0, [16.250318720818097, 4.952028938447833], 0.8739221457690426, true]]; let cus = loadFile(data); - for (let i = 0.5; i < 10; i += 0.5) + for (let i = 1; i < 10; i += 2) { expect(cus[0].GetOffsetCurves(i).length).toBe(1); } - for (let i = 0.1; i <= 0.9; i += 0.01) + for (let i = 0.4; i <= 0.6; i += 0.02) { expect(cus[0].GetOffsetCurves(-i).length).toBe(1); } - for (let i = 1; i <= 2; i += 0.1) + for (let i = 1; i <= 2; i += 0.2) { expect(cus[0].GetOffsetCurves(-i).length).toBe(0); } //变换曲线顺序 data = [1, ["Polyline", 1, 1, 1891, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 5, [22.178278439318607, -1.9155229050126357], 0, [22.83746943877066, -1.800164480108526], 0, [23.79329638797614, -6.11786552651948], -0.871731137783436, [23.348342463346004, -6.282663276382493], -0.7430788314178012, [22.903388538715866, -6.267501883395095], 0, true]]; cus = loadFile(data); - for (let i = 0.01; i <= 0.33; i += 0.01) + for (let i = 0.01; i <= 0.33; i += 0.03) { expect(cus[0].GetOffsetCurves(i).length).toBe(1); } @@ -155,7 +154,7 @@ describe("闭合多段线", () => let data = [1, ["Polyline", 1, 1, 264, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 6, [0, 0], 0, [5, 0], 0.9999999999999999, [5, 5], -0.9999999999999999, [5, 10], 0, [0, 10], 0, [0, 0], 0, false]]; let cus = loadFile(data); - for (let i = 0.5; i < 10; i += 0.5) + for (let i = 0.5; i < 10; i += 1.5) { expect(cus[0].GetOffsetCurves(i).length).toBe(1); } @@ -167,14 +166,14 @@ describe("闭合多段线", () => { expect(cus[0].GetOffsetCurves(-i).length).toBe(1); } - for (let i = 2.9; i <= 6; i += 0.1) + for (let i = 2.9; i <= 6; i += 0.5) { let len = cus[0].GetOffsetCurves(-i).length; expect(len).toBe(0); } //反转曲线 cus[0].Reverse(); - for (let i = 0.5; i < 10; i += 0.5) + for (let i = 0.5; i < 10; i += 1.5) { expect(cus[0].GetOffsetCurves(-i).length).toBe(1); } @@ -182,11 +181,11 @@ describe("闭合多段线", () => expect(cus[0].GetOffsetCurves(1.2).length).toBe(1); expect(cus[0].GetOffsetCurves(2).length).toBe(1); - for (let i = 2; i <= 2.8; i += 0.1) + for (let i = 2; i <= 2.8; i += 0.2) { expect(cus[0].GetOffsetCurves(i).length).toBe(1); } - for (let i = 2.9; i <= 6; i += 0.1) + for (let i = 2.9; i <= 6; i += 1) { let len = cus[0].GetOffsetCurves(i).length; expect(len).toBe(0); @@ -217,22 +216,22 @@ describe("闭合多段线", () => [1, ["Polyline", 1, 1, 3103, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 6, [7.068575921553821, 19.385189367549113], 0, [17.866251977281493, 27.179961431447197], -0.7242773730087224, [27.449988121418478, 20.215779833374317], -0.5496546648274403, [21.06083069199382, 18.554598901723907], 0.7351204491094537, [17.802360402987244, 16.70174324719076], -1.609719383557213, [7.068575921553821, 19.385189367549113], 0, true]]; let cus = loadFile(data); //外偏移 - for (let i = 0.1; i < 5; i += 0.1) + for (let i = 0.5; i < 5.5; i += 1) { expect(cus[0].GetOffsetCurves(-i).length).toBe(1); } //内偏移 - for (let i = 3.6; i > 0; i -= 0.1) + for (let i = 3.6; i > 0; i -= 0.6) { expect(cus[0].GetOffsetCurves(i).length).toBe(1); } - for (let i = 3.7; i <= 4.7; i += 0.1) + for (let i = 3.7; i <= 4.7; i += 0.2) { expect(cus[0].GetOffsetCurves(i).length).toBe(2); } expect(cus[0].GetOffsetCurves(5).length).toBe(1); - for (let i = 6.1; i < 10; i += 0.5) + for (let i = 6.1; i < 10; i += 1) { expect(cus[0].GetOffsetCurves(i).length).toBe(0); } @@ -243,7 +242,7 @@ describe("闭合多段线", () => [1, ["Polyline", 1, 1, 8895, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 9, [-35.77751476623335, 275.4953263952156], 0, [220.87993293360785, 358.6317790975911], 0, [317.8724610863793, 154.43698298649332], 0, [128.26300755464567, 91.72000989522755], 0, [202.6482547094027, 193.81740795077644], 0, [96.90452100901277, 149.33211308371583], 0, [167.64343251892882, 238.30270281783706], 0, [-5.9221441755043855, 147.87357882577945], 0, [115.1361992332179, 265.2855865896607], 0, true]]; let cus = loadFile(data); //外偏移 - - for (let i = 20; i < 200; i += 20) + for (let i = 20; i < 200; i += 100) { expect(cus[0].GetOffsetCurves(-i).length).toBe(1); } @@ -251,16 +250,16 @@ describe("闭合多段线", () => expect(cus[0].GetOffsetCurves(15).length).toBe(1); expect(cus[0].GetOffsetCurves(17.8).length).toBe(2); expect(cus[0].GetOffsetCurves(19).length).toBe(3); - for (let i = 20; i <= 40; i++) + for (let i = 20; i <= 40; i += 10) { expect(cus[0].GetOffsetCurves(i).length).toBe(3); } - for (let i = 41; i <= 44.3; i += 0.1) + for (let i = 41.3; i <= 44.3; i += 1) { expect(cus[0].GetOffsetCurves(i).length).toBe(2); } expect(cus[0].GetOffsetCurves(45).length).toBe(1); - for (let i = 48; i <= 200; i += 10) + for (let i = 50; i <= 250; i += 100) { expect(cus[0].GetOffsetCurves(i).length).toBe(0); } @@ -272,16 +271,23 @@ describe("闭合多段线", () => let cus = loadFile(data); //外偏移 - //内偏移+ - for (let i = -350; i <= 350; i += 50) + for (let i = -350; i <= 350; i += 100) { - if (i === 0) continue; expect(cus[0].GetOffsetCurves(i).length).toBe(1); } - expect(cus[0].GetOffsetCurves(360).length).toBe(0); for (let i = 360; i <= 460; i += 50) { expect(cus[0].GetOffsetCurves(i).length).toBe(0); } + cus[0].Reverse(); + for (let i = -350; i <= 350; i += 100) + { + expect(cus[0].GetOffsetCurves(-i).length).toBe(1); + } + for (let i = 360; i <= 460; i += 50) + { + expect(cus[0].GetOffsetCurves(-i).length).toBe(0); + } }) test('闭合多段线偏移测试10', () => { @@ -289,22 +295,22 @@ describe("闭合多段线", () => [1, ["Polyline", 1, 1, 4133, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -38.7066882611841, -36.73336766355714, 0, 1], 2, 10, [57.916496677407835, -1.0361149153581897], 0, [57.916496677407835, 9.149866136686853], 0, [63.00948720343037, 6.40233177396418], 0, [67.96845166297861, 11.696361399698116], 0, [67.96845166297861, 5.866227508067071], 0, [76.41209385085804, 8.144670638129776], -0.6438035714487224, [82.13500688930966, 1.215523001409662], -0.16133386709235895, [73.7315725213725, -7.388950466238915], -0.24328993833238707, [62.473382937533245, -7.388950466238914], 0.16864648307761998, [53.5472469103464, -6.102300228085856], -1.9523252757782097, true]]; let cus = loadFile(data); //外偏移 - - for (let i = 1; i < 20; i++) + for (let i = 5; i < 20; i += 5) { expect(cus[0].GetOffsetCurves(-i).length).toBe(1); } //内偏移+ expect(cus[0].GetOffsetCurves(2.3).length).toBe(1); - for (let i = 2.5; i < 4; i += 0.5) + for (let i = 2.5; i < 4; i += 1) { expect(cus[0].GetOffsetCurves(i).length).toBe(2); } - for (let i = 4.2; i <= 7.2; i += 0.4) + for (let i = 4.2; i <= 7.2; i += 0.8) { expect(cus[0].GetOffsetCurves(i).length).toBe(1); } - for (let i = 7.5; i <= 15.5; i++) + for (let i = 7.5; i <= 17.5; i += 5) { expect(cus[0].GetOffsetCurves(i).length).toBe(0); } @@ -351,11 +357,11 @@ describe("闭合多段线", () => expect(cus[0].GetOffsetCurves(0.5).length).toBe(2); expect(cus[0].GetOffsetCurves(0.9).length).toBe(1); - for (let i = 0.5; i <= 0.85; i += 0.05) + for (let i = 0.55; i <= 0.85; i++) { expect(cus[0].GetOffsetCurves(i).length).toBe(2); } - for (let i = 1; i <= 2; i += 0.1) + for (let i = 1; i <= 2; i += 0.2) { expect(cus[0].GetOffsetCurves(i).length).toBe(0); } @@ -550,7 +556,7 @@ describe("不规则不闭合多段线测试", () => } }) - test("test2", () => + test("test2-共线线段", () => { let data = [1, ["Polyline", 1, 1, 8814, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 7, [15.642409533480423, -31.01626057276902], 0, [38.129771973149346, -31.016260572769028], 0, [32.85929640135194, -26.50707591689791], 0, [47.440945483324754, -26.50707591689791], 0, [45.33685543194063, -31.016260572769028], 0, [61.52187596164093, -31.016260572769035], 0, [70.31099992504923, -35.88209931313313], 0, false]]; @@ -564,7 +570,18 @@ describe("不规则不闭合多段线测试", () => { expect(cus[0].GetOffsetCurves(-i).length).toBe(1); } + cus[0].Reverse(); + expect(cus[0].GetOffsetCurves(-18).length).toBe(2); + data = [1, ["Polyline", 1, 1, 22696, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 7, [21.944751443449043, -31.01626057276902], 0, [38.129771973149346, -31.016260572769028], 0, [32.85929640135194, -26.50707591689791], 0, [47.440945483324754, -26.50707591689791], 0, [45.33685543194063, -31.016260572769028], 0, [61.52187596164093, -31.016260572769035], 0, [70.31099992504923, -35.88209931313313], 0, false]]; + cus = loadFile(data); + expect(cus[0].GetOffsetCurves(11.4).length).toBe(1); + data = [1, ["Polyline", 1, 1, 24383, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -56.21146708819905, -48.62279820279199, 0, 1], 2, 7, [26.333787338902418, -31.01626057276902], 0, [35.05226039203026, -31.016260572769013], 0, [32.85929640135194, -26.50707591689791], 0, [47.440945483324754, -26.50707591689791], 0, [41.54871106124796, -31.016260572769013], 0, [61.52187596164093, -31.016260572769035], 0, [70.31099992504923, -35.88209931313313], 0, false]] + cus = loadFile(data); + expect(cus[0].GetOffsetCurves(5.2).length).toBe(1); + data = [1, ["Polyline", 1, 1, 4, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 6, [-3.158640226628895, -0.9915014164305944], 0, [-1.0906515580736538, -0.991501416430595], 0, [-1.983002832861189, 0.18413597733711037], 0, [1.0906515580736549, 0.3966005665722377], 0, [0.2974504249291776, -0.9915014164305944], 0, [3.966005665722378, -0.9915014164305953], 0, false]]; + cus = loadFile(data); + expect(cus[0].GetOffsetCurves(2.01133).length).toBe(1); }) test("test3", () => { @@ -582,18 +599,13 @@ describe("不规则不闭合多段线测试", () => let data = [1, ["Polyline", 1, 1, 14565, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -131.50093441946296, -806.1569163328921, 0, 1], 2, 24, [256.5228611988947, -38.705370748164505], 0, [372.1955588024039, 31.844231195771492], 0, [372.1955588024039, -31.54297461172431], 0, [450.9819163032461, 37.57414810492366], 0, [423.0485713711294, -54.10452244151095], 0, [589.216161736542, 52.97329979827009], 0, [611.0614699526845, -2.177150452319474], 0, [672.6580767260702, 61.21005535517633], 0, [678.0298738284004, 13.938240854670997], 0, [735.329042919922, 21.100636991111184], 0, [684.1179105443746, -21.515620020708024], 0, [730.6734854312358, -32.61733403219032], 0, [815.1897598412304, 38.29038771856768], 0, [835.6025888300849, -8.981426781937659], 0, [862.1034545349137, 74.4604882075907], 0, [943.4539498526012, 74.46048820759069], 0, [986.972668777612, -29.064785548515978], 0, [924.5022496755805, -66.26627108118637], 0, [1001.0109652050348, -106.27541589934134], 0, [965.9152241364777, -128.73669018321777], 0, [1006.6262837760039, -176.46689803645526], 0, [904.1467198558175, -189.8032796425069], 0, [981.3573502066429, -242.44689124534239], 0, [1004.5205393118904, -256.48518767276516], 0, false]]; let cus = loadFile(data); - for (let i = 50; i <= 250; i += 50) - { - expect(cus[0].GetOffsetCurves(-i).length).toBe(1); - } + expect(cus[0].GetOffsetCurves(-100).length).toBe(1); expect(cus[0].GetOffsetCurves(46.8).length).toBe(2); expect(cus[0].GetOffsetCurves(49.6).length).toBe(3); expect(cus[0].GetOffsetCurves(86.6).length).toBe(2); expect(cus[0].GetOffsetCurves(102.3).length).toBe(2); - for (let i = 110; i <= 200; i += 30) - { - expect(cus[0].GetOffsetCurves(i).length).toBe(1); - } + expect(cus[0].GetOffsetCurves(110).length).toBe(1); + }) test("test5", () => { @@ -650,21 +662,21 @@ describe("不规则不闭合多段线测试", () => [1, ["Polyline", 1, 1, 2347, false, 1, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -86.54515219838936, -34.782221464287886, 0, 1], 2, 5, [-51.274354719855246, 28.573003242461496], 0, [-13.931531095689206, 15.255196629685734], 3.7897716494829594, [-8.365342666825299, 14.77338745895928], 0, [5.4409985411529185, 25.415028100834675], 0.37399715496699776, [29.033295173881022, 23.38858533792915], 0, false]]; let cus = loadFile(data); expect(cus[0].GetOffsetCurves(-3.133).length).toBe(2); - for (let i = 10; i <= 60; i++) + for (let i = 10; i <= 60; i += 10) { expect(cus[0].GetOffsetCurves(i).length).toBe(1); } - for (let i = 5.9; i <= 43.3; i += 5) + for (let i = 5.9; i <= 43.3; i += 10) { expect(cus[0].GetOffsetCurves(-i).length).toBe(1); } cus[0].Reverse(); expect(cus[0].GetOffsetCurves(3.133).length).toBe(2); - for (let i = 10; i <= 60; i++) + for (let i = 10; i <= 60; i += 10) { expect(cus[0].GetOffsetCurves(-i).length).toBe(1); } - for (let i = 5.9; i <= 43.3; i += 5) + for (let i = 5.9; i <= 43.3; i += 10) { expect(cus[0].GetOffsetCurves(i).length).toBe(1); } @@ -680,6 +692,14 @@ describe("不规则不闭合多段线测试", () => expect(cus[0].GetOffsetCurves(i).length).toBe(1); } }) + test("test9-2圆弧没交点", () => + { + let data = + [1, ["Polyline", 1, 1, 23321, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 3, [-245.7800398731897, -124.83507012637789], 0.47532901948537815, [-247.69480466441718, -117.62074637472406], 0.12615539092932912, [-193.96898890583213, -126.5297489543612], 0, false]] + let cus = loadFile(data); + expect(cus[0].GetOffsetCurves(11.22).length).toBe(1); + expect(cus[0].GetOffsetCurves(-11.22).length).toBe(1); + }) }) diff --git a/src/Add-on/test/testIntersect.ts b/src/Add-on/test/testIntersect.ts index 7e3cdb11f..5129725a4 100644 --- a/src/Add-on/test/testIntersect.ts +++ b/src/Add-on/test/testIntersect.ts @@ -94,7 +94,7 @@ export class TestIntersect implements Command let cus = exRefSsRes.SelectSet.SelectEntityList as Curve[]; if (cus.length === 2) { - let pt = cus[0].IntersectWith(cus[1], IntersectOption.ExtendBoth); + let pt = cus[0].IntersectWith(cus[1], 0); console.log('pt: ', pt); if (pt.length) { diff --git a/src/Add-on/testEntity/TestCurve.ts b/src/Add-on/testEntity/TestCurve.ts index bea5d7acf..65657498e 100644 --- a/src/Add-on/testEntity/TestCurve.ts +++ b/src/Add-on/testEntity/TestCurve.ts @@ -93,7 +93,7 @@ export class TestTargeOnCurve implements Command testPtIn(outline: Polyline, l: Curve) { - if (outline.PtInCurve(l.StartPoint)) + if (outline.PtInCurve(l.EndPoint)) { l.ColorIndex = 3 } else diff --git a/src/GraphicsSystem/IntersectWith.ts b/src/GraphicsSystem/IntersectWith.ts index 3a081ab7f..b52cf8c64 100644 --- a/src/GraphicsSystem/IntersectWith.ts +++ b/src/GraphicsSystem/IntersectWith.ts @@ -1,4 +1,4 @@ -import { Vector3, EquirectangularReflectionMapping } from 'three'; +import { Vector3 } from 'three'; import { getDeterminantFor3V } from '../Common/CurveUtils'; import { Arc } from '../DatabaseServices/Arc'; import { Circle } from '../DatabaseServices/Circle'; @@ -242,7 +242,7 @@ export function IntersectLAndLFor3D(p1: Vector3, p2: Vector3, p3: Vector3, p4: V let v2 = p4.clone().sub(p3).normalize(); let w = p3.clone().sub(p1).normalize(); - if (equaln(Math.abs(v1.dot(v2)), 1, 1e-6) && equaln(Math.abs(v1.dot(w)), 1, 1e-6)) //平行共线 + if (equaln(Math.abs(v1.dot(v2)), 1, 1e-6) && (equal(w, new Vector3()) || equaln(Math.abs(v1.dot(w)), 1, 1e-6))) //平行共线 { let pts = [p1, p2, p3, p4]; pts.sort(comparePoint('xyz')); diff --git a/src/GraphicsSystem/OffsetPolyline.ts b/src/GraphicsSystem/OffsetPolyline.ts index a021735e0..17632bcc6 100644 --- a/src/GraphicsSystem/OffsetPolyline.ts +++ b/src/GraphicsSystem/OffsetPolyline.ts @@ -61,7 +61,6 @@ export class PolyOffestUtil // 裁剪并优化的曲线 let { boxCurves, outputCus } = this.trimByContours(this.m_RetCurves); - this.m_RetCurves = this.optimizeCus(boxCurves, outputCus); this.m_RetCurves.push(...this.unNeedCutCus); @@ -115,7 +114,7 @@ export class PolyOffestUtil } }) - //寻找自交线段 + // 寻找自交线段 for (let i = 0; i < outputCus.length; i++) { let c1 = outputCus[i]; @@ -133,45 +132,45 @@ export class PolyOffestUtil if (c2b.min.y > c1b.max.y) continue; - //如果线段端点相连,且交点不是端点,那就是2条共线的直线,删掉短的被包含的那条 - let isLink = [c1.StartPoint, c1.EndPoint].some(p => equal(p, c2.StartPoint) || equal(p, c2.EndPoint)); - if (isLink) + //被包含的直线删掉 + if (c1 instanceof Line && c2 instanceof Line) { - if (c1 instanceof Arc || c2 instanceof Arc) continue; - let pts = c1.IntersectWith(c2, IntersectOption.OnBothOperands); - if (pts.length === 1 && !(equal(pts[0], c2.StartPoint) || equal(pts[0], c2.EndPoint))) + //c1完全在c2内 + if (c2.PtOnCurve(c1.StartPoint) && c2.PtOnCurve(c1.EndPoint)) { - if (c1.Length > c2.Length) - { - outputCus.splice(j, 1); - j--; - } - else - { - outputCus.splice(i, 1); - i--; - break; - } + outputCus.splice(i, 1); + i--; + break; + } + else if (c1.PtOnCurve(c2.StartPoint) && c1.PtOnCurve(c2.EndPoint)) + { + // c2完全在c1内 + outputCus.splice(j, 1); + j--; + continue; } - continue; } + //如果线段端点相连,跳过 + let isLink = [c1.StartPoint, c1.EndPoint].some(p => equal(p, c2.StartPoint) || equal(p, c2.EndPoint)); + if (isLink) continue; + let pts = c1.IntersectWith(c2, IntersectOption.OnBothOperands); if (pts.length > 0) { //按照从左到右,从上到下,分别取前后部分,即去掉中间部分 - let c1s = c1.GetSplitCurvesByPts(pts); - if (c1s.length === 2) - { - outputCus[i] = c1s[0]; - boxCurves.set(c1s[0], c1s[0].BoundingBox); - } - let c2s = c2.GetSplitCurvesByPts(pts); - if (c2s.length === 2) + + [c1, c2].forEach((c, index) => { - outputCus[j] = c2s[1]; - boxCurves.set(c2s[1], c2s[1].BoundingBox); - } + let cs = c.GetSplitCurvesByPts(pts); + if (cs.length === 2) + { + let box = SortEntityByBox(cs, true); + index === 0 ? outputCus[i] = cs[index] : outputCus[j] = cs[index]; + boxCurves.set(cs[index], box.get(cs[index])); + } + }) + } } } @@ -502,11 +501,8 @@ export class PolyOffestUtil let iPts = cirs.length > 1 ? frontLine.IntersectWith(cirs[1], 0) : []; if (iPts.length === 0) { - let dist = frontLine.EndPoint.distanceToSquared(cirs[0].Center); - if (equaln(dist, this.m_dist2)) - iPts = [frontLine.EndPoint]; - else - iPts = frontLine.IntersectWith(cirs[0], 0); + //第一个圆肯定和frontline相切,切点为frontline的终点 + iPts = [frontLine.EndPoint]; } else { @@ -515,10 +511,10 @@ export class PolyOffestUtil //#region 避免错误块 //假设我们认为连接一定能成功,那么下面的if不是必要的 - if (!iPts) - { - console.error("补圆失败,距离为", this.m_OffestDist); - } + // if (!iPts) + // { + // console.error("补圆失败,距离为", this.m_OffestDist); + // } //#endregion let iPt = this.selectFitInterPt(iPts, frontLine.EndPoint); @@ -600,9 +596,6 @@ export class PolyOffestUtil { cu = onCu0Pts.length < onCu1Pts.length ? arc1 : arc2; } - //防止加入0长度圆弧 - if (equaln(cu.Length, 0, 1e-6)) - return; this.m_RetCurves.push(cu);