You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
WebCAD/__test__/Polyline/offset.test.ts

883 lines
48 KiB

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";
Factory(Polyline);
function loadFile(data)
{
return LoadEntityFromFileData(data) as Curve[];
}
function EntityToMatchSnapshot(ens: Curve[])
{
expect(ens.length).toMatchSnapshot();
for (let c of ens)
{
expect(c.Length).toMatchSnapshot();
}
}
function testOffset(pl: Curve, dis)
{
let cus = pl.GetOffsetCurves(dis);
EntityToMatchSnapshot(cus);
}
test('IKKGK圆与直线补圆弧', () =>
{
let pl = loadFile(
[1, "Polyline", 1, 1, 0, false, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -47.808747539346534, 10.92028558763661, 0, 1], 2, 3, [-0.906131771640112, 6.969061295372345], 3.7897716494829594, [4.660056657223795, 6.487252124645892], 0, [18.466397865202012, 17.128892766521286], 0, false]
)[0] as Polyline;
//负1 左边. 禁止补圆弧
let cus = pl.GetOffsetCurves(-1);
EntityToMatchSnapshot(cus);
pl.GetOffsetCurves(-5.654208780429431);
//
//翻转曲线后测试
pl.Reverse();
cus = pl.GetOffsetCurves(1);
EntityToMatchSnapshot(cus);
//圆丢失的问题
cus = pl.GetOffsetCurves(-1.926388985025112);
EntityToMatchSnapshot(cus);
});
describe("闭合多段线", () =>
{
test('闭合多段线偏移测试1', () =>
{
let data =
[1, "Polyline", 1, 1, 0, false, 7, 0, [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 = 1; i < 10; i += 1)
{
expect(cus[0].GetOffsetCurves(i).length).toBe(1);
}
for (let i = -0.5; i < -0.15; i += 0.05)
{
expect(cus[0].GetOffsetCurves(i).length).toBe(1);
}
for (let i = 2; i < 10; i += 2)
{
expect(cus[0].GetOffsetCurves(-i).length).toBe(0);
}
})
test('闭合多段线偏移测试2', () =>
{
let data =
[1, "Polyline", 1, 1, 0, false, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 4, [8.176442643449754, 4.003694129881114], 0.6482011490054378, [8.554554536583165, 4.090460859042256], 0, [7.7292787370841225, 8.733182129315965], 0, [7.8227800907745895, 4.037582052934876], 1.223388515290821, true]
let cus = loadFile(data);
expect(cus[0].GetOffsetCurves(-0.1799).length).toBe(2);
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.03)
{
expect(cus[0].GetOffsetCurves(i).length).toBe(1);
}
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 < 0.5; i += 0.05)
{
expect(cus[0].GetOffsetCurves(-i).length).toBe(0);
}
})
test('闭合多段线偏移测试3', () =>
{
let data =
[1, "Polyline", 1, 1, 0, false, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 5, [12.52535684411379, 4.512623511896158], 0.39558516940595195, [13.121416971132648, 4.487590129452889], 0, [12.414545456418505, 8.796498405316765], 0, [12.015990240675425, 8.743859037199755], 0, [12.015990240675425, 4.4951100391838885], 0.8508932598252141, true]
let cus = loadFile(data);
for (let i = 0.5; i < 10; i += 1)
{
expect(cus[0].GetOffsetCurves(i).length).toBe(1);
}
for (let i = 0.1; i <= 0.5; i += 0.1)//i+=0.01
{
expect(cus[0].GetOffsetCurves(-i).length).toBe(1);
}
for (let i = 0.51; i <= 1; i += 0.1)
{
expect(cus[0].GetOffsetCurves(-i).length).toBe(0);
}
})
test('闭合多段线偏移测试4', () =>
{
let data =
[1, "Polyline", 1, 1, 0, false, 7, 0, [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 = 1; i < 10; i += 2)
{
expect(cus[0].GetOffsetCurves(i).length).toBe(1);
}
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.2)
{
expect(cus[0].GetOffsetCurves(-i).length).toBe(0);
}
//变换曲线顺序
data =
[1, "Polyline", 1, 1, 0, false, 7, 0, [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.03)
{
expect(cus[0].GetOffsetCurves(i).length).toBe(1);
}
for (let i = 0.34; i <= 1; i += 0.1)
{
expect(cus[0].GetOffsetCurves(i).length).toBe(0);
}
})
test('闭合多段线偏移测试5', () =>
{
let data =
[1, "Polyline", 1, 1, 0, false, 7, 0, [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 += 1.5)
{
expect(cus[0].GetOffsetCurves(i).length).toBe(1);
}
expect(cus[0].GetOffsetCurves(-1.3).length).toBe(2);
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)
{
expect(cus[0].GetOffsetCurves(-i).length).toBe(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 += 1.5)
{
expect(cus[0].GetOffsetCurves(-i).length).toBe(1);
}
expect(cus[0].GetOffsetCurves(1.3).length).toBe(2);
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.2)
{
expect(cus[0].GetOffsetCurves(i).length).toBe(1);
}
for (let i = 2.9; i <= 6; i += 1)
{
let len = cus[0].GetOffsetCurves(i).length;
expect(len).toBe(0);
}
})
test('闭合多段线偏移测试6', () =>
{
let data =
[1, "Polyline", 1, 1, 0, false, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -2.007355593658339, -15.226898894860806, 0, 1], 2, 6, [0.06393073988345588, -13.474722415885717], 0, [0.06393073988345643, -4.4950563800695225], 0, [6.069811270331949, -4.495056380069524], -0.9999999999999999, [6.0698112703319484, -9.101508437403805], 0.8261854469247998, [6.069811270331948, -13.53303193559881], 0, [0.06393073988345588, -13.474722415885717], 0, false]
let cus = loadFile(data);
for (let i = 0.5; i < 10; i += 1)//i+=0.5
{
expect(cus[0].GetOffsetCurves(-i).length).toBe(1);
}
for (let i = 0.1; i <= 2.9; i += 0.4)//i+=0.1
{
expect(cus[0].GetOffsetCurves(i).length).toBe(1);
}
for (let i = 3; i <= 6; i += 0.5)//i+=0.1
{
let len = cus[0].GetOffsetCurves(i).length;
expect(len).toBe(0);
}
})
test('闭合多段线偏移测试7', () =>
{
let data =
[1, "Polyline", 1, 1, 0, false, 7, 0, [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.5; i < 5.5; i += 1)
{
expect(cus[0].GetOffsetCurves(-i).length).toBe(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.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 += 1)
{
expect(cus[0].GetOffsetCurves(i).length).toBe(0);
}
})
test('闭合多段线偏移测试8', () =>
{
let data =
[1, "Polyline", 1, 1, 0, false, 7, 0, [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 += 100)
{
expect(cus[0].GetOffsetCurves(-i).length).toBe(1);
}
//内偏移+
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 += 10)
{
expect(cus[0].GetOffsetCurves(i).length).toBe(3);
}
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 = 50; i <= 250; i += 100)
{
expect(cus[0].GetOffsetCurves(i).length).toBe(0);
}
})
test('闭合多段线偏移测试9', () =>
{
let data =
[1, "Polyline", 1, 1, 0, false, 2, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -2494.1602062139054, -154.37421492307953, 0, 1], 2, 4, [-835.9056689963722, -81.71614968554674], -1.404257507243489, [-2.5205246091134654, -224.3682931983378], -0.7704346688180675, [-677.9527382520764, -55.635630094036955], 0, [-835.9056689963722, -81.71614968554674], 0, false]
let cus = loadFile(data);
//外偏移 -
//内偏移+
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);
}
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', () =>
{
let data =
[1, "Polyline", 1, 1, 0, false, 7, 0, [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 = 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 += 1)
{
expect(cus[0].GetOffsetCurves(i).length).toBe(2);
}
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 <= 17.5; i += 5)
{
expect(cus[0].GetOffsetCurves(i).length).toBe(0);
}
})
test('闭合多段线偏移测试11', () =>
{
let data =
[1, "Polyline", 1, 1, 0, false, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 9, [8.533519553072624, 3.044692737430166], 0, [8.198324022346368, 5.782122905027932], 0, [9.483240223463685, 4.594972067039105], 0, [10.293296089385473, 4.958100558659217], 0, [11.298882681564244, 3.50558659217877], 0, [11.648044692737429, 3.1424581005586587], 0, [9.525139664804467, 2.3324022346368705], 0, [9.748603351955305, 3.589385474860334], 0, [8.519553072625698, 1.3268156424580995], 0, true]
let cus = loadFile(data);
//外偏移 -
for (let i = 0.1; i <= 0.3; i += 0.1)
{
expect(cus[0].GetOffsetCurves(-i).length).toBe(1);
}
//内偏移+
expect(cus[0].GetOffsetCurves(0.15).length).toBe(1);
for (let i = 0.2; i <= 0.7; i += 0.1)
{
expect(cus[0].GetOffsetCurves(i).length).toBe(2);
}
for (let i = 0.8; i <= 3.8; i++)
{
expect(cus[0].GetOffsetCurves(i).length).toBe(0);
}
})
test('闭合多段线偏移测试12', () =>
{
let data =
[1, "Polyline", 1, 1, 0, false, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 12, [13.549363225511495, 3.33570646745377], 0, [14.34284463241268, 4.996139781895137], 0, [14.523074259257426, 3.9557232996550056], 0, [15.838887129162556, 4.9814356943054605], 0, [15.943612070431213, 3.9627476292376005], 0, [17.33950450111622, 4.461280640196535], 0, [18.123624596131165, 2.7156799524846913], 0, [17.99903152781382, 1.6177035379380693], 0, [16.03466125512531, 2.900960499995888], 0, [15.014220997727234, 1.7794865537465168], 0, [14.332835411729478, 2.6268506799232134], 0, [13.549363225511495, 3.33570646745377], 0, false]
let cus = loadFile(data);
//外偏移 -
for (let i = 0.5; i <= 2; i += 0.5)
{
expect(cus[0].GetOffsetCurves(-i).length).toBe(1);
}
//内偏移+
expect(cus[0].GetOffsetCurves(0.3).length).toBe(1);
expect(cus[0].GetOffsetCurves(0.4).length).toBe(2);
expect(cus[0].GetOffsetCurves(0.46).length).toBe(3);
expect(cus[0].GetOffsetCurves(0.5).length).toBe(2);
expect(cus[0].GetOffsetCurves(0.9).length).toBe(1);
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.2)
{
expect(cus[0].GetOffsetCurves(i).length).toBe(0);
}
})
test('闭合多段线偏移测试13', () =>
{
let data =
[1, "Polyline", 1, 1, 0, false, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 13.053732578466253, -1.845982384833612, 0, 1], 2, 12, [10.73237450059647, 5.925995426719515], 0, [14.934000173256667, 9.279899014962986], 0, [15.443475259425389, 6.338838290261696], 0, [16.902963217271246, 7.476549375511614], 0, [17.07910144494388, 5.7632047972414195], 0, [18.04054823840169, 6.106578652047782], 0, [19.469515702452366, 2.925424892792106], 0, [19.064111106000592, -0.6472031134391991], 0, [17.253277279358528, 2.956832838161076], 0, [14.95258895308757, 3.1324290048358128], 0, [13.37431523183268, 1.7225442000746034], 0, [10.73237450059647, 5.925995426719515], 0, false]
let cus = loadFile(data);
//外偏移 -
for (let i = 0.5; i <= 2; i += 0.5)
{
expect(cus[0].GetOffsetCurves(-i).length).toBe(1);
}
//内偏移+
expect(cus[0].GetOffsetCurves(1).length).toBe(1);
expect(cus[0].GetOffsetCurves(1.2).length).toBe(3);
})
test('闭合多段线偏移测试14', () =>
{
let data =
[1, "Polyline", 1, 1, 0, false, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 14, [340.820007357324, -3.870032999900914], 0, [431.6163856609081, 116.2815653567217], 0, [485.54806901416487, 54.84040710617603], 0, [533.3356365423672, 67.81131829240235], 0, [624.1320148459513, 40.504136847715344], 0, [656.9006325795757, 23.43714844478601], -0.783383849320176, [633.0068488154745, -74.86870475608706], 0.4462700081240285, [605.0169878346704, -106.27196341747704], -0.8416099256631104, [529.9222388617812, -128.11770857322662], 0, [510.1245323143834, -22.98506001118185], 0, [430.251026588674, -129.48306764546098], 0, [430.251026588674, -65.99387078656383], 0, [351.74287993519897, -145.86737651227318], 0, [303.2726328708796, -87.83961594231337], 0, true]
let cus = loadFile(data);
//外偏移 -
for (let i = 10; i <= 90; i += 10)
{
expect(cus[0].GetOffsetCurves(-i).length).toBe(1);
}
//内偏移+
for (let i = 5; i <= 25; i += 10)
{
expect(cus[0].GetOffsetCurves(i).length).toBe(1);
}
expect(cus[0].GetOffsetCurves(26.5).length).toBe(2);
expect(cus[0].GetOffsetCurves(36).length).toBe(2);
expect(cus[0].GetOffsetCurves(36.1).length).toBe(3);
expect(cus[0].GetOffsetCurves(45).length).toBe(2);
expect(cus[0].GetOffsetCurves(60).length).toBe(1);
for (let i = 71; i <= 101; i += 10)
{
expect(cus[0].GetOffsetCurves(i).length).toBe(0);
}
})
test('闭合多段线偏移测试15', () =>
{
let data =
[1, "Polyline", 1, 1, 0, false, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 8, [-3.096429035694039, 1.977370035127478], 0, [2.646251476487261, 5.186031066288948], -0.5113280232193118, [8.158566581303122, 2.619102241359773], 0.23700604598013766, [11.103952861189804, -1.2148363240793185], -1.4842976346055852, [7.994019861756378, -4.028585228328609], 0.5402454464135219, [3.1398916351274853, -2.8932128634560885], -1.0879771453350477, [1.4615150957507161, -0.803469525212464], -0.082022192610066, [-3.096429035694039, 1.977370035127478], 0, true]
let cus = loadFile(data);
//外偏移 -
for (let i = 0.5; i <= 5.5; i += 1)
{
expect(cus[0].GetOffsetCurves(-i).length).toBe(1);
}
//内偏移+
for (let i = 0.1; i <= 1.8; i += 0.3)
{
expect(cus[0].GetOffsetCurves(i).length).toBe(1);
}
for (let i = 1.9; i <= 2.2; i += 0.05)
{
expect(cus[0].GetOffsetCurves(i).length).toBe(2);
}
for (let i = 2.3; i <= 3.7; i += 0.2)
{
expect(cus[0].GetOffsetCurves(i).length).toBe(1);
}
for (let i = 3.9; i <= 6.9; i += 0.5)
{
expect(cus[0].GetOffsetCurves(i).length).toBe(0);
}
})
test('闭合多段线偏移测试16', () =>
{
let data =
[1, "Polyline", 1, 1, 0, false, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 5, [-6.203966005665723, -0.056657223796033884], 0, [-1.8834846458923415, -0.923353563739375], -1.4125691360015384, [-1.9069913201133035, -1.5932937790368253], 0, [-6.189801699716714, -2.2096317280453257], -2.3881275241710798, [-6.203966005665723, -0.056657223796033884], 0, true]
let cus = loadFile(data);
//外偏移 -
//内偏移+
for (let i = -1.5; i <= 1.5; i += 0.2)
{
expect(cus[0].GetOffsetCurves(i).length).toBe(1);
}
expect(cus[0].GetOffsetCurves(1.6).length).toBe(0);
for (let i = 1.6; i <= 4.6; i++)
{
expect(cus[0].GetOffsetCurves(i).length).toBe(0);
}
})
})
describe("补圆弧测试", () =>
{
test("补圆弧测试1", () =>
{
let data =
[1, "Polyline", 1, 1, 0, false, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 5, [-99.60068327971061, 80.69599512140186], 0, [-48.362234971168355, 80.69599512140186], -0.9874208089640422, [-14.972250883848176, 88.46675505445091], -1.1745224194600496, [18.29631507951812, 78.51046889023182], 0, [89.44733571649859, 78.5104688902318], 0, false]
let cus = loadFile(data);
// 向上-
// 向下+
expect(cus[0].GetOffsetCurves(17.45).length).toBe(2);
for (let i = -55; i <= 55; i += 5)
{
if (i === 0) continue;
EntityToMatchSnapshot(cus[0].GetOffsetCurves(i));
}
})
test("补圆弧测试2", () =>
{
let data =
[1, "Polyline", 1, 1, 0, false, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 5, [-869.4193524531552, -50.92359793870933], 0, [-609.861025770732, -50.92359793870939], -0.8167984427288847, [-480.7149315189898, -23.068558002059024], -1.4042575072434897, [-317.9835774160859, -50.92359793870939], 0, [-92.77019349218811, -50.92359793870939], 0, false]
let cus = loadFile(data);
// 向上-
// 向下+
expect(cus[0].GetOffsetCurves(83.24).length).toBe(2);
expect(cus[0].GetOffsetCurves(86.46).length).toBe(2);
for (let i = 364; i <= 395; i++)
{
expect(cus[0].GetOffsetCurves(i).length).toBe(1);
}
})
test("补圆弧测试3", () =>
{
let data =
[1, "Polyline", 1, 1, 0, false, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 4, [-894.3165541673695, -331.80629190023], 0, [-671.3300245231958, -331.80629190023], -1.0058680701224356, [-535.7124860261546, -329.1982623137485], 0, [-214.92484688892245, -329.1982623137485], 0, false]
let cus = loadFile(data);
// 向上-
// 向下+
expect(cus[0].GetOffsetCurves(-1200).length).toBe(1);
for (let i = 63; i <= 94; i++)
{
expect(cus[0].GetOffsetCurves(i).length).toBe(1);
}
})
test("补圆弧测试3", () =>
{
let data =
[1, "Polyline", 1, 1, 0, false, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 23, [-25.572010711696727, -62.383195892823124], 0, [-10.312959798454724, -40.55427583637971], 0, [0.28360333574111785, -55.81332674962171], 0, [9.820510156517361, -48.18380129300071], 0, [18.721623189241864, -65.13830230771404], 0, [29.530117586121616, -60.47581452866788], 0, [39.06702440689787, -79.97349069558823], 0, [51.78290016793288, -70.64851513749588], -0.6227891115113805, [70.85671380948538, -80.60928448363998], 0.3759603135798005, [86.75155851077912, -99.68309812519247], -1.1383492019405204, [81.45327694368122, -117.6972554533254], 0.6271394112393051, [57.2931129977147, -138.2545879336653], -1.2933960333754264, [21.68866086681669, -138.2545879336653], -0.8106183277649434, [-17.73055399239181, -132.9563063665674], 0, [-43.37423677714574, -105.82910474302606], 0, [-51.003762233766736, -83.5763221612148], 0, [-48.67251834424364, -64.07864599429448], 0, [-62.65998168138215, -50.09118265715597], 0, [-86.39628310198083, -65.35023357039795], 0, [-86.39628310198083, -33.13668164244262], 0, [-73.68040734094582, -13.639005475522275], 0, [-43.16230551446182, -13.639005475522275], 0, [-33.62539869368556, -11.307761585999202], 0, false]
let cus = loadFile(data);
// 向外-
// 向内+
expect(cus[0].GetOffsetCurves(18).length).toBe(3);
for (let i = 50; i <= 80; i += 5)
{
expect(cus[0].GetOffsetCurves(-i).length).toBe(1);
}
//需要删除一个无效的线段 ref #IKO6L
expect(cus[0].GetOffsetCurves(27.3).length).toBe(1);
})
test("补圆弧测试3", () =>
{
let data =
[1, "Polyline", 1, 1, 0, false, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 10, [-5.637393767705383, -1.586402266288952], 0, [-0.84985835694051, 1.954674220963173], -0.5207626681247078, [1.728045325779038, 1.0906515580736542], -1.2136457904456304, [4.060938624362605, 1.3838754084985838], -1.0694858869096764, [6.891142200566573, -0.047681051558073895], -1.4716493502287318, [9.178341602266286, -2.976612659490083], -1.5003222663355726, [8.09233325325779, -7.040916632294616], -0.9628743606456998, [4.53257790368272, -7.478753541076488], -1.076087427994497, [2.3229461756373926, -7.478753541076488], 0, [-5.39660056657224, -7.478753541076487], 0, false]
let cus = loadFile(data);
// 向外-
// 向内+
expect(cus[0].GetOffsetCurves(1.88).length).toBe(2);
expect(cus[0].GetOffsetCurves(2.12).length).toBe(2);
expect(cus[0].GetOffsetCurves(3.2).length).toBe(1);
for (let i = 0.5; i <= 3.5; i += 0.5)
{
expect(cus[0].GetOffsetCurves(-i).length).toBe(1);
}
for (let i = 3.3; i <= 5.3; i += 0.5)
{
expect(cus[0].GetOffsetCurves(i).length).toBe(0);
}
for (let i = 2.33; i <= 3.2; i += 0.2)
{
expect(cus[0].GetOffsetCurves(i).length).toBe(1);
}
})
})
describe("不规则不闭合多段线测试", () =>
{
test("test1", () =>
{
let data =
[1, "Polyline", 1, 1, 0, false, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 6, [16.034190840579708, -16.545186318840567], 0, [36.985943188405784, -16.545186318840567], 0, [31.311510260869554, -12.507609043478254], 0, [48.334809043478245, -12.507609043478254], 0, [43.969860637681144, -16.6543100289855], 0, [56.84645843478259, -16.654310028985503], 0, false]
let cus = loadFile(data);
for (let i = 1.27; i <= 2.96; i += 0.2)
{
expect(cus[0].GetOffsetCurves(i).length).toBe(2);
}
expect(cus[0].GetOffsetCurves(9.16).length).toBe(2);
for (let i = 0.5; i <= 7.5; i++)
{
expect(cus[0].GetOffsetCurves(-i).length).toBe(1);
}
})
test("test2-共线线段", () =>
{
let data =
[1, "Polyline", 1, 1, 0, false, 7, 0, [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]
let cus = loadFile(data);
for (let i = 1.82; i <= 3.37; i += 0.3)
{
expect(cus[0].GetOffsetCurves(i).length).toBe(2);
}
expect(cus[0].GetOffsetCurves(18).length).toBe(2);
for (let i = 1; i <= 27; i += 5)
{
expect(cus[0].GetOffsetCurves(-i).length).toBe(1);
}
cus[0].Reverse();
expect(cus[0].GetOffsetCurves(-18).length).toBe(2);
data =
[1, "Polyline", 1, 1, 0, false, 7, 0, [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, 0, false, 7, 0, [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, 0, false, 7, 0, [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", () =>
{
let data =
[1, "Polyline", 1, 1, 0, false, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 5, [-41.52354973772388, -163.989590203395], 0, [-41.5235497377239, -231.3399374277236], 0, [21.016058399152634, -231.3399374277236], 0, [21.016058399152623, -294.68133541250876], 1.378670046466899, [261.5530127717545, -216.10593031745873], 0, false]
let cus = loadFile(data);
for (let i = -100; i <= 181; i += 30)
{
expect(cus[0].GetOffsetCurves(i).length).toBe(1);
}
expect(cus[0].GetOffsetCurves(-122.6).length).toBe(2);
})
test("test4", () =>
{
let data =
[1, "Polyline", 1, 1, 0, false, 7, 0, [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);
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);
expect(cus[0].GetOffsetCurves(110).length).toBe(1);
})
test("test5", () =>
{
let data =
[1, "Polyline", 1, 1, 0, false, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 18, [-3.895184135977337, 0.7648725212464592], 0, [0.8215297450424939, 0.7648725212464592], 0, [-2.1246458923512743, -2.1388101983002827], 0, [5.311614730878187, -2.1388101983002827], 0, [1.89801699716714, 3.4844192634560907], 0, [6.671388101983003, 3.4844192634560907], 0, [6.671388101983002, -3.4985835694051], 0, [10.6657223796034, -0.11331444759206824], 0, [8.810198300283286, 1.161473087818697], 0, [14.674220963172807, 3.30028328611898], 0, [16.713881019830033, -2.521246458923512], 0, [11.55807365439094, -5.773371104815864], 0, [3.8441926345609083, -5.773371104815863], 0, [2.3569405099150167, -8.787535410764873], 0, [-1.5297450424929169, -6.090651558073655], 0, [-6.586402266288951, -12.674220963172807], 0, [-8.113314447592067, -8.767705382436262], 0, [-10.929178470254957, -12.436260623229463], 0, false]
let cus = loadFile(data);
expect(cus[0].GetOffsetCurves(0.755).length).toBe(3);
expect(cus[0].GetOffsetCurves(1.915).length).toBe(4);
expect(cus[0].GetOffsetCurves(2.36).length).toBe(4);
expect(cus[0].GetOffsetCurves(2.892).length).toBe(2);
expect(cus[0].GetOffsetCurves(3.6850).length).toBe(1);
expect(cus[0].GetOffsetCurves(-1).length).toBe(3);
for (let i = 2; i <= 4; i++)
{
expect(cus[0].GetOffsetCurves(-i).length).toBe(1);
}
})
test("test6", () =>
{
let data =
[1, "Polyline", 1, 1, 0, false, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -38.54242746474825, 6.4891615215880964, 0, 1], 2, 3, [18.466397865202012, 17.128892766521286], 0, [4.660056657223795, 6.487252124645892], -3.7897716494829594, [-0.906131771640112, 6.969061295372345], 0, false]
let cus = loadFile(data);
for (let i = -2.766; i <= 4.57; i++)
{
expect(cus[0].GetOffsetCurves(-i).length).toBe(1);
}
for (let i = 2.9; i <= 5.3; i += 0.5)
{
expect(cus[0].GetOffsetCurves(i).length).toBe(2);
}
for (let i = 6.14; i <= 8; i += 0.5)
{
expect(cus[0].GetOffsetCurves(i).length).toBe(1);
}
cus[0].Reverse();
for (let i = -2.766; i <= 4.57; i++)
{
expect(cus[0].GetOffsetCurves(i).length).toBe(1);
}
for (let i = 2.9; i <= 5.3; i += 0.5)
{
expect(cus[0].GetOffsetCurves(-i).length).toBe(2);
}
for (let i = 6.14; i <= 8; i += 0.5)
{
expect(cus[0].GetOffsetCurves(-i).length).toBe(1);
}
})
test("test7", () =>
{
let data =
[1, "Polyline", 1, 1, 0, false, 1, 0, [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 += 10)
{
expect(cus[0].GetOffsetCurves(i).length).toBe(1);
}
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 += 10)
{
expect(cus[0].GetOffsetCurves(-i).length).toBe(1);
}
for (let i = 5.9; i <= 43.3; i += 10)
{
expect(cus[0].GetOffsetCurves(i).length).toBe(1);
}
})
test("test8", () =>
{
let data =
[1, "Polyline", 1, 1, 0, false, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 8, [14.442408344729744, 12.584578126613017], 0, [14.442408344729742, 4.502438174603963], 0, [20.086360825183, 4.502438174603963], 0, [20.086360825183, -0.9157562066311582], 0, [26.226981123916133, -0.9157562066311598], 0.4633692494967541, [33.496391918739924, 7.663051563657783], -0.673355221273594, [51.96340443478295, 18.996108144407916], 0.32851266965536, [64.10919017271836, 18.996108144407913], -1.9784627492130062, false]
let cus = loadFile(data);
for (let i = -15; i <= 15; i += 5)
{
if (i === 0) continue;
expect(cus[0].GetOffsetCurves(i).length).toBe(1);
}
})
test("test9-2圆弧没交点", () =>
{
let data =
[1, "Polyline", 1, 1, 0, false, 7, 0, [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);
})
test("test10-共线部分错误裁剪", () =>
{
let data =
[1, "Polyline", 1, 1, 0, false, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 13, [37846.488077851434, 5711.914029035103], 0, [28152.473806690192, 5711.914029035104], 0, [31338.416239942802, 10002.31650581529], 0, [39750.51284565329, 10002.316505815288], 0, [39750.51284565329, 17632.65706309083], 0, [45109.026777541825, 17632.65706309083], 0, [45109.02677754183, 10002.31650581529], 0, [54643.39210261924, 10002.31650581529], -0.8704734266845496, [55266.30970531861, 5526.15551510335], 0, [45201.90603450778, 5526.155515103216], 0, [45201.90603450778, 249.9945243911434], 0, [37846.488077851434, 435.75303832303064], 0, [37846.488077851434, 5711.914029035103], 0, false]
let cus = loadFile(data);
expect(cus[0].GetOffsetCurves(2700).length).toBe(1);
})
})
test('提前丢失所有的线段', () =>
{
let pl = loadFile(
[1, "Polyline", 1, 1, 0, false, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -17.386067452264705, 17.11283965241085, 0, 1], 2, 3, [108.37693694676932, 28.257776463252547], 0.4472440944881872, [108.37693694676932, 17.68555707305448], 3.5940684866260213, [111.70676982557188, 14.089337563947739], 0.5086040192926764, false]
)[0] as Polyline;
let cus = pl.GetOffsetCurves(-7.155086190577401);
expect(cus.length).toBe(0);
});
test('中间区域需要圆裁剪', () =>
{
let pl = loadFile(
[1, "Polyline", 1, 1, 0, false, 1, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -1325.2800870006804, -703.3564533406019, 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]
)[0] as Polyline;
let cus = pl.GetOffsetCurves(-35.6);
EntityToMatchSnapshot(cus);
});
test('拱门偏移', () =>
{
let pl = loadFile(
[1, "Polyline", 1, 1, 0, false, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 4, [0, 0], 0, [0, 2], -1, [1, 2], 0, [1, 0], 0, false]
)[0] as Polyline;
let cus = pl.GetOffsetCurves(0.4);
EntityToMatchSnapshot(cus);
cus = pl.GetOffsetCurves(-0.4);
EntityToMatchSnapshot(cus);
});
test('土偏移因为点在圆弧切线上错误导致的丢失', () =>
{
let pl = loadFile(
[1, "Polyline", 1, 1, 0, false, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -9159.663865546216, 8361.344537815126, 0, 1], 2, 17, [28900.928792569663, -4648.336577340973], -0.9999999999999999, [28900.928792569663, 580.3540867812549], 0, [37687.5122530782, 580.3540867812552], 0, [37687.5122530782, 5568.3816889128875], 0, [27851.140930176796, 5568.381688912888], 0, [31251.043800494088, 10146.917554273516], 0, [39591.53702088006, 10146.917554273514], 0, [39591.53702088006, 17633.191417258837], -0.9999999999999999, [45238.18434134903, 17633.191417258837], 0, [45238.184341349035, 10146.917554273516], 0, [54628.482972136226, 10146.917554273516], -0.8741669928857767, [55271.13672581777, 5382.623174980927], 0, [45331.063598314984, 5382.623174981001], 0, [45331.063598314984, 1648.4655418896164], 0, [53885.44891640867, 1648.4655418896143], -0.6803347640614656, [56371.20555398866, -4648.336577340822], 0, [28900.928792569663, -4648.336577340976], 0, false]
)[0] as Polyline;
let cus = pl.GetOffsetCurves(-801);
expect(cus.length).toBe(1);
cus = pl.GetOffsetCurves(801);
expect(cus.length).toBe(1);
});
//ISSUE #IKSMH
test('闭合多段线判断精度和重复交点参数导致偏移丢失', () =>
{
let pl = loadFile(
[1, "Polyline", 1, 1, 0, false, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.042016806722689815, 0.028011204481792618, 0, 1], 2, 11, [15758.920914649752, -1642.832074394305], 1.1432358165627696, [15758.920914649756, -3551.5797508523133], 0.010240353549940432, [20850.68748853413, -2761.478041111637], 0.39873042440013945, [23564.17781148077, 901.7338948663096], 0.029927117999965277, [22452.27083112051, 6973.8467189556395], 0, [31778.947378692996, 6973.846718955635], 0, [31327.636369627562, 7575.594679533537], 0, [31646.066893308867, 7787.881806674935], 0, [20955.832135358123, 7787.881806674936], 0, [21703.795934364476, 5637.485884531684], -0.559029831351755, [15758.920914649752, -1642.832074394304], 0, false]
)[0] as Polyline;
for (let d of [40, 50, 100, 200, 300])
{
let cus = pl.GetOffsetCurves(d);
expect(cus.length).toBe(1);
expect(cus[0].Length).toMatchSnapshot();
}
});
//ISSUE #IKSMH
test('简单图形因为点在线内算法错误导致的丢失', () =>
{
let pl = loadFile(
[1, "Polyline", 1, 1, 0, false, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.01400560224089542, 0.37815126050420145, 0, 1], 2, 7, [2.075848303393214, 0.09193367302761479], -3.109533447960064, [2.8332320619106284, 1.1077844311377247], 0, [3.542914171656688, 1.1077844311377247], 0, [3.542914171656688, -0.4890219560878247], 0, [2.0758483033932134, -0.4890219560878247], 0, [2.0758483033932134, -0.4890219560878247], 0, [2.0758483033932134, 0.09193367302761501], 0, false]
)[0] as Polyline;
for (let d of [0.2, 0.3, 0.4, 0.5])
{
let cus = pl.GetOffsetCurves(d);
expect(cus.length).toBe(1);
expect(cus[0].Length).toMatchSnapshot();
}
});
test('圆求交错误导致的线丢失', () =>
{
let pl = loadFile(
[1, "Polyline", 1, 1, 0, false, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 8, [245.62964413684085, 1116.1391538309313], -0.6953179171905909, [357.14209871457234, 1741.1251588427203], -0.6821635222887411, [892.2042303620135, 1596.040230558597], 0.37526047823909664, [1317.3934365017694, 1221.2756098839004], 0.14384173346393453, [1715.0964405621776, 1096.7424042631346], 0.026448384140957723, [1793.2064027435729, 1099.4889679050386], -0.1912121824403452, [733.4339688924879, 1000.3133228797258], -0.3304377553967397, [245.62964413684108, 1116.139153830931], 0, false]
)[0] as Polyline;
for (let d of [10, 20, 30, 40, 269, 280, 320])//270 280 320因为圆弧选点导致的错误
{
let cus = pl.GetOffsetCurves(d);
expect(cus.length).toBe(1);
expect(cus[0].Length).toMatchSnapshot();
cus = pl.GetOffsetCurves(-d);
expect(cus.length).toBe(1);
expect(cus[0].Length).toMatchSnapshot();
}
});
test('海豚圆选点导致的错误', () =>
{
let cus = loadFile(
[1, "Polyline", 1, 1, 0, false, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 5.653674874772044, 7.68794016265532, 0, 1], 2, 8, [933.8513988456853, 1095.3110732229222], -0.8740345959811056, [920.2952842385836, 1109.7702508499967], 0, [1041.059365726312, 1258.0770175893115], -0.47531159669542833, [1335.8552450029906, 1258.0770175893115], 0.4755782365532149, [1656.4630038262355, 1258.2164686086066], 0.011876098909362552, [1662.4715751586689, 1265.9781137467012], -0.44350119503715907, [1205.357990246699, 1110.5168645352571], 0.28917769175330255, [933.8513988456853, 1095.3110732229222], 0, false]
)
let pl = cus[0] as Polyline;
testOffset(pl, 10);
testOffset(pl, -10);
});
test('复杂圆盘选点', () =>
{
let cus = loadFile(
[1, "Polyline", 1, 1, 0, false, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 21, [-4.193877551020408, 0.5102040816326532], 0, [-2.051020408163265, 2.418367346938776], 0, [-1.0612244897959189, 0.7244897959183673], 0, [1.591836734693877, 1.153061224489796], 0, [1.5918367346938769, -0.13265306122449028], 0.20147559294404743, [2.6632653061224483, -2.6836734693877555], -1.1981710602936018, [-0.959183673469388, -5.244897959183675], 0.25804389257576854, [-2.8061224489795915, -3.897959183673469], 0.18939417098307887, [-5.571428571428572, -4.6020408163265305], -1.079995071965533, [-7.982857142857145, -0.6404081632653051], 1.1849950705219705, [-11.56285714285714, 4.179591836734694], -6.781917601823303, [-9.102857142857141, 9.019591836734694], 0.9585222487987152, [-7.222857142857144, 8.599591836734694], -0.7670525420358739, [14.397142857142853, 8.599591836734689], -0.13182825774707282, [14.397142857142851, 1.1795918367346951], 0.7921649344252789, [18.149142857142856, -0.836408163265304], -2.2405773687929207, [18.653142857142853, -5.176408163265303], 0.3179128740881875, [12.381142857142857, -5.176408163265302], -1.0648321015993136, [9.13314285714286, 0.08759183673469462], 1.761831734888522, [3.0011428571428587, 3.7835918367346952], -1.1347525744875853, [-1.702857142857143, 4.399591836734693], -0.019957132806512356, true]
);
let pl = cus[0] as Polyline;
for (let d of [0.8, -0.8, 0.2, 0.3, 0.4])
{
testOffset(pl, d);
}
});
test('补充bug测试', () =>
{
let data =
[1, "Polyline", 1, 1, 0, false, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 3014.1813078325877, -118.48659432946494, 0, 1], 2, 25, [7212.90932057689, -239.9823077249786], -0.9999999999999921, [7212.9093205768895, 122.19897643916269], 0, [7779.276759343887, 122.19897643916269], 0, [7779.276759344071, 428.1814280252842], 0.1947099739542557, [7740.981455628771, 522.7925370761521], 0, [7304.310456694637, 522.7925370760897], 0, [7489.002384561892, 796.1365903196343], 0, [7742.516525859682, 796.1365903196343], 0, [7742.516525859682, 961.2048135488966], -1.3463056702167695, [8021.98728468389, 876.8699986200176], 0, [8021.987284683929, 789.3738464533299], -0.05161685745547489, [8028.1320183974, 790.0098847386233], 0, [8444.377142303902, 790.0098847389027], -1.1043175340350022, [8413.555740131487, 479.90559801040376], 0, [8049.204632346665, 479.9055980109795], 1.512505548953077, [8054.570478774117, 467.3001115689552], 0.06283615294599319, [8055.684165377956, 468.79464872233984], 0, [8055.684165377962, 182.7089738110588], -0.056342427094734256, [8062.381207162069, 183.46603224647305], 0, [8468.88396462686, 183.4660322464784], -0.20525770195463292, [8655.475816304977, 103.49809581299945], -0.8336853670274493, [8492.531297747215, -120.51154890075377], 0, [8104.435007347477, -120.51154890071338], -0.6646338605614993, [7740.532382653638, -239.9823077249987], 0, [7212.90932057689, -239.9823077249786], 0, false]
let pl = loadFile(data)[0];
let cus = pl.GetOffsetCurves(10);
expect(cus.length).toBe(1);
expect(cus[0].Length).toMatchSnapshot();
cus = pl.GetOffsetCurves(-10);
expect(cus.length).toBe(1);
expect(cus[0].Length).toMatchSnapshot();
})
test('多段线存在0长度线段导致偏移错误', () =>
{
let pl = loadFile(
[1, "Polyline", 1, 1, 0, false, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 9, [18464.40681262459, -261.95809608907166], 0, [23818.6302458671, 7299.349805818285], 0, [34567.94904695702, 3988.7231028210094], 0, [34567.94904695702, 3988.7231028210094], 0, [42946.69564096247, 8484.635909360519], -0.7515576999403787, [50221.90000063549, 1045.9438112678758], -0.43729267560971036, [41557.04986439571, -997.652918977356], -0.5825417553875781, [27905.82370635756, -6760.5956982689095], 0, [19404.461308537397, -2591.658368568635], 0, true]
)[0];
testOffset(pl, 400);
testOffset(pl, -400);
});
test('纯圆生成的多段线偏移', () =>
{
let pl = loadFile(
[1, "Polyline", 1, 1, 0, false, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1904.6173097681894, -4.547473508864641e-13, 0, 1], 2, 2, [18361.211643461193, 495.8146231175723], 0.7691548555148293, [18910.40925296759, 2564.4589522583397], 1.3001283068422635, true]
)[0];
testOffset(pl, 100);
testOffset(pl, -100);
});
test('多段线因为合并问题造成的错误', () =>
{
let pl = loadFile(
[1, "Polyline", 1, 1, 0, false, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 10, [560.4622946261899, 280.3468208092485], 0, [273.1213872832369, 280.3468208092485], 0, [273.1213872832369, 70.80924855491334], 0, [273.1213872832369, 70.80924855491334], 0, [520.5860801571987, 70.80924855491334], 0.45552774411272906, [773.2934581245079, 9.947706891888771], 1.0105662598284268, [843.111615774608, 120.72879526430421], 0.42745194242823337, [695.3090834219281, 321.1478937918483], 3.4733857741050023, [602.1148370593586, 307.0986147536708], 0.07222028753966563, [560.4622946261899, 280.3468208092485], 0, false]
)[0];
testOffset(pl, 37.8831);
});