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__/Booloperate/bool.test.ts

250 lines
28 KiB

import { arraySum } from "../../src/Common/ArrayExt";
import { Region } from "../../src/DatabaseServices/Entity/Region";
import { BoolOpeartionType } from "../../src/GraphicsSystem/BoolOperateUtils";
import { LoadRegionsFromFileData } from "../Utils/LoadEntity.util";
import "../Utils/jest.util";
//没有洞
test('2没有洞的面域,相交', () =>
{
let data =
[2, "Region", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 1, 1, 1, 1, "Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 4, [-2.8550724637681157, -3.3478260869565215], 0, [1.4347826086956512, -3.3478260869565215], 0, [1.4347826086956512, -0.304347826086957], 0, [-2.8550724637681157, -0.304347826086957], 0, true, 0, "Region", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 1, 1, 1, 1, "Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 4, [-1.4492753623188404, -4.695652173913043], 0, [2.2753623188405787, -4.695652173913043], 0, [2.2753623188405787, -1.434782608695652], 0, [-1.4492753623188404, -1.434782608695652], 0, true, 0];
let regs: Region[] = LoadRegionsFromFileData(data);
expect(regs.length).toBe(2);
regs[0].BooleanOper(regs[1], BoolOpeartionType.Intersection);
expect(regs[0].ShapeManager.ShapeList.length).toBe(1);
regs = LoadRegionsFromFileData(data);
regs[0].BooleanOper(regs[1], BoolOpeartionType.Union);
expect(regs[0].ShapeManager.ShapeList.length).toBe(1);
regs = LoadRegionsFromFileData(data);
regs[0].BooleanOper(regs[1], BoolOpeartionType.Union);
expect(regs[0].ShapeManager.ShapeList.length).toBe(1);
});
test('2面域,大的包含小的', () =>
{
let data =
[2, "Region", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 1, 1, 1, 1, "Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 4, [-1.8800742693409744, -12.621788424068765], 0, [6.005662808022923, -12.621788424068765], 0, [6.005662808022923, -8.540226017191973], 0, [-1.8800742693409744, -8.540226017191973], 0, true, 0, "Region", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 1, 1, 1, 1, "Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 4, [-0.03742716332378216, -11.254663151862458], 0, [3.9450681948424067, -11.254663151862458], 0, [3.9450681948424067, -9.53089650429799], 0, [-0.03742716332378216, -9.53089650429799], 0, true, 0];
let regs = LoadRegionsFromFileData(data);
testBool(regs[0], regs[1], 1, 0, 1, 0, 1, 1);
testBool(regs[1], regs[0], 1, 0, 1, 0, 0, 0);
});
test('2没有洞的面域,不相交', () =>
{
let data =
[2, "Region", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 1, 1, 1, 1, "Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 4, [-4.711014253295126, -24.920368119197704], 0, [5.1917279358166155, -24.920368119197704], 0, [5.1917279358166155, -16.88167151862464], 0, [-4.711014253295126, -16.88167151862464], 0, true, 0, "Region", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 1, 1, 1, 1, "Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 4, [7.948962035530085, -25.735888064183378], 0, [14.084778764469913, -25.735888064183378], 0, [14.084778764469913, -19.716574184527214], 0, [7.948962035530085, -19.716574184527214], 0, true, 0];
let regs: Region[] = LoadRegionsFromFileData(data);
expect(regs.length).toBe(2);
regs[0].BooleanOper(regs[1], BoolOpeartionType.Intersection);
expect(regs[0].ShapeManager.ShapeList.length).toBe(0);
regs = LoadRegionsFromFileData(data);
regs[0].BooleanOper(regs[1], BoolOpeartionType.Union);
expect(regs[0].ShapeManager.ShapeList.length).toBe(2);
regs = LoadRegionsFromFileData(data);
regs[0].BooleanOper(regs[1], BoolOpeartionType.Subtract);
expect(regs[0].ShapeManager.ShapeList.length).toBe(1);
});
test("多无洞面域,互相相交", () =>
{
let data =
[3, "Region", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 1, 1, 1, 1, "Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 4, [-0.8607930519232294, -2.5865143049017547], 0, [4.439811998377018, -2.5865143049017547], 0, [4.439811998377018, 1.1818845980460777], 0, [-0.8607930519232294, 1.1818845980460777], 0, true, 0, "Region", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 1, 1, 1, 1, "Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 4, [-2.8550724637681157, -3.3478260869565215], 0, [1.4347826086956512, -3.3478260869565215], 0, [1.4347826086956512, -0.304347826086957], 0, [-2.8550724637681157, -0.304347826086957], 0, true, 0, "Region", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 1, 1, 1, 1, "Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 4, [-1.4492753623188404, -4.695652173913043], 0, [2.2753623188405787, -4.695652173913043], 0, [2.2753623188405787, -1.434782608695652], 0, [-1.4492753623188404, -1.434782608695652], 0, true, 0];
let regs = LoadRegionsFromFileData(data);
expect(regs.length).toBe(3);
testRegionsBool(regs, 1, 0, 1, 0, 1, 0);
});
test('简单差集', () =>
{
let d = [2, "Region", 4, 2, 621, false, 1, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 1, 1, 1, 1, "Polyline", 4, 2, 0, false, 0, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 2, 4, [1445.5476870961775, -414.05675626156443], 0, [2311.4623870961777, -414.05675626156443], 0, [2311.4623870961777, 21.589743738435573], 0, [1445.5476870961775, 21.589743738435573], 0, true, 0, "Region", 4, 2, 622, false, 1, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 1, 1, 1, 1, "Polyline", 4, 2, 0, false, 0, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 2, 4, [1833.6495890686276, 21.589743738435573], 0, [2041.7917890686276, 21.589743738435573], 0, [2041.7917890686276, 206.17484373843558], 0, [1833.6495890686276, 206.17484373843558], 0, true, 0];
let regs = LoadRegionsFromFileData(d);
regs[0].BooleanOper(regs[1], BoolOpeartionType.Subtract);
expect(regs[0].Area).toMatchSnapshot();
});
test("多无洞面域,互不相交", () =>
{
let data =
[3, "Region", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 1, 1, 1, 1, "Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 4, [-4.711014253295126, -24.920368119197704], 0, [5.1917279358166155, -24.920368119197704], 0, [5.1917279358166155, -16.88167151862464], 0, [-4.711014253295126, -16.88167151862464], 0, true, 0, "Region", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 1, 1, 1, 1, "Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 4, [7.948962035530085, -25.735888064183378], 0, [14.084778764469913, -25.735888064183378], 0, [14.084778764469913, -19.716574184527214], 0, [7.948962035530085, -19.716574184527214], 0, true, 0, "Region", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 1, 1, 1, 1, "Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 4, [-14.225413611461313, -24.182516740401145], 0, [-8.90511682750716, -24.182516740401145], 0, [-8.90511682750716, -16.609831536962744], 0, [-14.225413611461313, -16.609831536962744], 0, true, 0];
let regs = LoadRegionsFromFileData(data);
expect(regs.length).toBe(3);
testRegionsBool(regs, 3, 0, 0, 0, 1, 0);
});
test('2面域,各有一个洞,不相交', () =>
{
let data =
[2, "Region", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 1, 1, 1, 1, "Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 4, [-22.59187156135242, -39.71001649292836], 0, [-10.261209993169047, -39.71001649292836], 0, [-10.261209993169047, -32.47907298072205], 0, [-22.59187156135242, -32.47907298072205], 0, true, 1, "Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 4, [-19.318918182143253, -36.28483272398853], 0, [-14.523660905627494, -36.28483272398853], 0, [-14.523660905627494, -34.38195285235529], 0, [-19.318918182143253, -34.38195285235529], 0, true, "Region", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 1, 1, 1, 1, "Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 4, [-6.759911029363891, -42.52627870294555], 0, [4.048446641512894, -42.52627870294555], 0, [4.048446641512894, -34.9147592164126], 0, [-6.759911029363891, -34.9147592164126], 0, true, 1, "Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 4, [-3.7153032347507127, -40.69951402617764], 0, [1.308299626361034, -40.69951402617764], 0, [1.308299626361034, -37.42656064696847], 0, [-3.7153032347507127, -37.42656064696847], 0, true];
let regs = LoadRegionsFromFileData(data);
testBool(regs[0], regs[1], 2, 2, 0, 0, 1, 1);
});
test('2面域,各有一个洞,相交', () =>
{
let data =
[2, "Region", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 1, 1, 1, 1, "Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 4, [-6.759911029363891, -42.52627870294555], 0, [4.048446641512894, -42.52627870294555], 0, [4.048446641512894, -34.9147592164126], 0, [-6.759911029363891, -34.9147592164126], 0, true, 1, "Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 4, [-3.7153032347507127, -40.69951402617764], 0, [1.308299626361034, -40.69951402617764], 0, [1.308299626361034, -37.42656064696847], 0, [-3.7153032347507127, -37.42656064696847], 0, true, "Region", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 1, 1, 1, 1, "Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 4, [-1.081717492410313, -43.85068309360228], 0, [15.009034702120339, -43.85068309360228], 0, [15.009034702120339, -32.98143326683323], 0, [-1.081717492410313, -32.98143326683323], 0, true, 1, "Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 4, [6.484132877203438, -41.29321254612721], 0, [12.345002881833807, -41.29321254612721], 0, [12.345002881833807, -36.81763908804584], 0, [6.484132877203438, -36.81763908804584], 0, true];
let regs = LoadRegionsFromFileData(data);
testBool(regs[0], regs[1], 1, 2, 1, 0, 1, 0);
testBool(regs[1], regs[0], 1, 2, 1, 0, 2, 1);
});
test('2面域,包含关系,小的有洞', () =>
{
let data =
[2, "Region", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 1, 1, 1, 1, "Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 4, [-15.04124423071174, -72.72878802550831], 0, [12.451564154645265, -72.72878802550831], 0, [12.451564154645265, -54.08056528350259], 0, [-15.04124423071174, -54.08056528350259], 0, true, 1, "Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 4, [-9.286935498892833, -69.21226602273008], 0, [9.041603424678508, -69.21226602273008], 0, [9.041603424678508, -59.08894510564126], 0, [-9.286935498892833, -59.08894510564126], 0, true, "Region", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 1, 1, 1, 1, "Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 4, [-22.180849509079643, -77.41748402921259], 0, [19.591169433013167, -77.41748402921259], 0, [19.591169433013167, -48.32625655168367], 0, [-22.180849509079643, -48.32625655168367], 0, true, 0];
let regs = LoadRegionsFromFileData(data);
expect(regs.length).toBe(2);
testBool(regs[1], regs[0], 1, 0, 1, 1, 2, 1);
testBool(regs[0], regs[1], 1, 0, 1, 1, 0, 0);
});
test('2面域,包含关系,大的有洞被小的包含,小的有洞', () =>
{
let data =
[2, "Region", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 1, 1, 1, 1, "Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 4, [-46.60469323746657, -127.77834155990918], 0, [24.855296309899348, -127.77834155990918], 0, [24.855296309899348, -89.28840982040936], 0, [-46.60469323746657, -89.28840982040936], 0, true, 1, "Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 4, [-24.077640165123658, -113.60569227598484], 0, [3.6709152749808487, -113.60569227598484], 0, [3.6709152749808487, -102.26757284884535], 0, [-24.077640165123658, -102.26757284884535], 0, true, "Region", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 1, 1, 1, 1, "Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 4, [-59.58385626590253, -133.178866865994], 0, [39.83354881627835, -133.178866865994], 0, [39.83354881627835, -84.72332489316635], 0, [-59.58385626590253, -84.72332489316635], 0, true, 1, "Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 4, [-15.723236376705094, -111.24855692139529], 0, [-1.5207499363935426, -111.24855692139529], 0, [-1.5207499363935426, -105.60933436421276], 0, [-15.723236376705094, -105.60933436421276], 0, true];
let regs = LoadRegionsFromFileData(data);
expect(regs.length).toBe(2);
testBool(regs[0], regs[1], 1, 1, 1, 1, 0, 0);
testBool(regs[1], regs[0], 1, 1, 1, 1, 2, 2);
});
test('2面域,各有洞,形状和洞都相交', () =>
{
let data =
[2, "Region", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 1, 1, 1, 1, "Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 4, [-55.41885848474738, -244.74737129761687], 0, [79.76223873944839, -244.74737129761687], 0, [79.76223873944839, -181.20070166231113], 0, [-55.41885848474738, -181.20070166231113], 0, true, 1, "Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 4, [-27.689402643886723, -225.97221890536744], 0, [58.38744986211828, -225.97221890536744], 0, [58.38744986211828, -196.79852057279527], 0, [-27.689402643886723, -196.79852057279527], 0, true, "Region", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 1, 1, 1, 1, "Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 4, [-15.846614211852472, -278.5426456036658], 0, [52.032782898587726, -278.5426456036658], 0, [52.032782898587726, -158.95936728995414], 0, [-15.846614211852472, -158.95936728995414], 0, true, 1, "Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 4, [3.2173866787392393, -273.0545241351621], 0, [37.87920647981508, -273.0545241351621], 0, [37.87920647981508, -164.1586402601155], 0, [3.2173866787392393, -164.1586402601155], 0, true];
let regs = LoadRegionsFromFileData(data);
expect(regs.length).toBe(2);
testBool(regs[0], regs[1], 1, 5, 4, 0, 4, 0);
testBool(regs[1], regs[0], 1, 5, 4, 0, 4, 0);
});
test("多都有洞面域,互不相交", () =>
{
let data =
[3, "Region", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 1, 1, 1, 1, "Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 4, [-22.59187156135242, -39.71001649292836], 0, [-10.261209993169047, -39.71001649292836], 0, [-10.261209993169047, -32.47907298072205], 0, [-22.59187156135242, -32.47907298072205], 0, true, 1, "Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 4, [-19.318918182143253, -36.28483272398853], 0, [-14.523660905627494, -36.28483272398853], 0, [-14.523660905627494, -34.38195285235529], 0, [-19.318918182143253, -34.38195285235529], 0, true, "Region", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 1, 1, 1, 1, "Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 4, [-6.759911029363891, -42.52627870294555], 0, [4.048446641512894, -42.52627870294555], 0, [4.048446641512894, -34.9147592164126], 0, [-6.759911029363891, -34.9147592164126], 0, true, 1, "Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 4, [-3.7153032347507127, -40.69951402617764], 0, [1.308299626361034, -40.69951402617764], 0, [1.308299626361034, -37.42656064696847], 0, [-3.7153032347507127, -37.42656064696847], 0, true, "Region", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 1, 1, 1, 1, "Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 4, [-32.341023130284626, -29.89099796417434], 0, [-20.945903228429888, -29.89099796417434], 0, [-20.945903228429888, -23.98549786905254], 0, [-32.341023130284626, -23.98549786905254], 0, true, 1, "Polyline", 1, 1, -1, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 4, [-28.59810053478489, -28.809709214363306], 0, [-22.276720151274237, -28.809709214363306], 0, [-22.276720151274237, -25.73219508028575], 0, [-28.59810053478489, -25.73219508028575], 0, true];
let regs = LoadRegionsFromFileData(data);
expect(regs.length).toBe(3);
testRegionsBool(regs, 3, 3, 0, 0, 1, 1);
});
test("有问题面域测试", () =>
{
let data =
[2, "Region", 1, 1, 7, false, 7, 0, [0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 995.4564695921745, 866.7576945200351, 0, 1], 1, 1, 1, 1, "Polyline", 1, 1, 0, false, 7, 0, [0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 995.4564695921745, 866.7576945200351, 0, 1], 2, 12, [1151.784316715255, 505.6870652512325], 0, [-48.215683284744955, 505.6870652512325], 0, [-48.215683284744955, 436.3728364140229], 0, [-322.28257444753535, 436.3728364140229], 0, [-322.28257444753535, 255.1386559489065], 0, [-48.215683284744955, 255.13865594890694], 0, [-48.215683284744955, 160.58169222797642], 0, [-310.4629539824191, 160.58169222797642], 0, [-310.4629539824191, -12.772741260395605], 0, [-48.215683284744955, -12.772741260395605], 0, [-48.215683284744955, -94.31293474876725], 0, [1151.784316715255, -94.31293474876725], 0, true, 0, "Region", 1, 1, 6, false, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -983.721937321937, -229.2831908831909, 0, 1], 1, 1, 1, 1, "Polyline", 1, 1, 0, false, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -983.721937321937, -229.2831908831909, 0, 1], 2, 5, [1966.4056656537157, 1219.4025937658553], 0, [2139.7600991420877, 1219.4025937658553], 0, [2139.7600991420877, 1275.3802040368082], 0, [1966.4056656537157, 1275.3802040368082], 0, [1966.4056656537157, 1219.4025937658553], 0, true, 0];
let regs = LoadRegionsFromFileData(data);
testRegionsBool(regs, 1, 0, 1, 0, 2, 0);
});
test("有交点时", () =>
{
let data =
[2, "Region", 1, 1, 5, false, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -14.957264957253415, -392.4501424501543, 0, 1], 1, 1, 1, 1, "Polyline", 1, 1, 0, false, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -14.957264957253415, -392.4501424501543, 0, 1], 2, 6, [89.29853006702479, 1021.4029398659504], 0, [0, 1021.4029398659504], 0, [0, 1039.4029398659504], 0, [80.29853006702479, 1039.4029398659504], 0, [600, 1039.4029398659504], 0, [600, 1021.4029398659504], 0, true, 0, "Region", 1, 1, 6, false, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -14.957264957253415, -392.4501424501543, 0, 1], 1, 1, 1, 1, "Polyline", 1, 1, 0, false, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -14.957264957253415, -392.4501424501543, 0, 1], 2, 4, [0, 0], 0, [600, 0], 0, [600, 1200], 0, [0, 1200], 0, true, 0];
let regs = LoadRegionsFromFileData(data);
expect(regs.length).toBe(2);
regs[1].BooleanOper(regs[0], BoolOpeartionType.Subtract);
expect(regs[1].Explode().length).toBe(2);
});
//#IQ937
test('特殊相交', () =>
{
testSubtract(
[2, "Region", 1, 1, 13, false, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 2147.1101515831265, -2428.922411894075, 0, 1], 1, 1, 1, 1, "Polyline", 1, 1, 0, false, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 2147.1101515831265, -2428.922411894075, 0, 1], 2, 8, [286.3247863247866, -182.3361823361823], 0, [5.698005698005659, -192.3076923076923], 0, [-207.97720797720808, -166.66666666666663], 0, [-215.09971509971524, 45.584045584045604], 0, [-215.09971509971524, 313.39031339031345], 0, [52.70655270655277, 274.92877492877494], 0, [293.44729344729353, 250.71225071225066], 0, [286.3247863247866, 18.518518518518544], 0, true, 0, "Region", 1, 1, 12, false, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 2147.1101515831265, -2428.922411894075, 0, 1], 1, 1, 1, 1, "Polyline", 1, 1, 0, false, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 2147.1101515831265, -2428.922411894075, 0, 1], 2, 4, [286.3247863247866, 18.518518518518544], 0, [5.698005698005659, -192.3076923076923], 0, [-215.09971509971524, 45.584045584045604], 0, [52.70655270655277, 274.92877492877494], 0, true, 0]
, 4);
testSubtract(
[2, "Region", 1, 1, 7, false, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -165.24216524216527, -477.2079772079772, 0, 1], 1, 1, 1, 1, "Polyline", 1, 1, 0, false, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -165.24216524216527, -477.2079772079772, 0, 1], 2, 4, [0, 0], 0, [600, 0], 0, [600, 1200], 0, [0, 1200], 0, true, 0, "Region", 1, 1, 8, false, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -165.24216524216527, -477.2079772079772, 0, 1], 1, 1, 1, 1, "Polyline", 1, 1, 0, false, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -165.24216524216527, -477.2079772079772, 0, 1], 2, 17, [260.68452291480645, 694.8814057850639], 0, [268.61637170569537, 691.99444892248], 0, [569.9719350514073, 582.3099939341178], 0, [563.8155724715452, 565.3955267599715], 0, [262.46000912583327, 675.0799817483337], 0, [244.5953021712127, 681.582203323704], 0, [234.37028331333872, 685.3038058327808], 0, [-5.684341886080802e-14, 599.9999989101887], 0, [-6.156362579862105, 616.9144660843351], 0, [208.05604371187087, 694.881405785064], 0, [0, 770.6076127553729], 0, [6.156362579862048, 787.5220799295191], 0, [234.37028331333858, 704.4590057373472], 0, [245.7073243841179, 708.5853512317643], 0, [247.65394027111975, 709.2938614721828], 0, [557.659209066764, 822.1265517794905], 0, [563.815571646626, 805.212084605344], 0, true, 0]
, 2);
testSubtract(
[2, "Region", 1, 1, 63, false, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 1, 1, 1, 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, [4456.332258552945, -1732.8363833524356], 0, [4915.293761397059, -1732.8363833524356], 0, [4915.293761397059, -1334.2078480183466], 0, [4456.332258552945, -1334.2078480183466], 0, [4456.332258552945, -1732.8363833524356], 0, true, 0, "Region", 1, 1, 64, false, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 1, 1, 1, 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, [4456.332258552945, -1533.522115685391], 0, [4685.8130099750015, -1334.2078480183466], 0, [4915.293761397059, -1533.522115685391], 0, [4685.8130099750015, -1732.8363833524356], 0, true, 0]
, 4);
});
function testSubtract(data: any[], count: number)
{
let regs = LoadRegionsFromFileData(data);
regs[0].BooleanOper(regs[1], BoolOpeartionType.Subtract);
let expregs = regs[0].Explode();
expect(expregs.length).toBe(count);
}
function testRegion(reg: Region)
{
if (reg)
{
let shapeCount = reg.ShapeManager.ShapeList.length;
let holeCount = arraySum(reg.ShapeManager.ShapeList.map(s => s.Holes.length));
return { shapeCount, holeCount };
} else return { shapeCount: 0, holeCount: 0 };
}
function testBool(reg1: Region, reg2: Region, uShapeCount: number, uHoleCount: number, iShapeCount: number, iHoleCount: number, sShapeCount: number, sHoleCount: number)
{
let a = reg1.Clone() as Region;
a.BooleanOper(reg2, BoolOpeartionType.Union);
let shapeCount1 = testRegion(a).shapeCount;
let holeCount1 = testRegion(a).holeCount;
let b = reg1.Clone() as Region;
b.BooleanOper(reg2, BoolOpeartionType.Intersection);
let shapeCount2 = testRegion(b).shapeCount;
let holeCount2 = testRegion(b).holeCount;
let c = reg1.Clone() as Region;
c.BooleanOper(reg2, BoolOpeartionType.Subtract);
let shapeCount3 = testRegion(c).shapeCount;
let holeCount3 = testRegion(c).holeCount;
expect(shapeCount1).toBe(uShapeCount);
expect(holeCount1).toBe(uHoleCount);
expect(shapeCount2).toBe(iShapeCount);
expect(holeCount2).toBe(iHoleCount);
expect(shapeCount3).toBe(sShapeCount);
expect(holeCount3).toBe(sHoleCount);
}
function RegionsBoolOperate(reg: Region[], boolType: BoolOpeartionType): Region | undefined
{
let regs = reg.map(r => r.Clone() as Region);
let firstReg = regs[0];
for (let i = 1; i < regs.length; i++)
{
if (firstReg.ShapeManager.ShapeCount)
{
firstReg.BooleanOper(regs[i], boolType);
}
}
return firstReg;
}
function testRegionsBool(regs: Region[], uShapeCount: number, uHoleCount: number, iShapeCount: number, iHoleCount: number, sShapeCount: number, sHoleCount: number)
{
let unionReg = RegionsBoolOperate(regs, BoolOpeartionType.Union);
let shapeCount1 = testRegion(unionReg).shapeCount;
let holeCount1 = testRegion(unionReg).holeCount;
let intReg = RegionsBoolOperate(regs, BoolOpeartionType.Intersection);
let shapeCount2 = testRegion(intReg).shapeCount;
let holeCount2 = testRegion(intReg).holeCount;
let subReg = RegionsBoolOperate(regs, BoolOpeartionType.Subtract);
let shapeCount3 = testRegion(subReg).shapeCount;
let holeCount3 = testRegion(subReg).holeCount;
expect(shapeCount1).toBe(uShapeCount);
expect(holeCount1).toBe(uHoleCount);
expect(shapeCount2).toBe(iShapeCount);
expect(holeCount2).toBe(iHoleCount);
expect(shapeCount3).toBe(sShapeCount);
expect(holeCount3).toBe(sHoleCount);
}
test('因为判断同向错误导致的布尔运算错误', () =>
{
let d =
{ "file": [2, "Region", 10, 2, 113, 0, 1, 1, 71, [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, 1, 1, 1, 1, "Polyline", 10, 2, 0, 0, 0, 7, 71, [1, 1.8369701987210297e-16, 0, 0, -1.8369701987210297e-16, 1, 0, 0, 0, 0, 1, 0, 84.0663826298624, 29.997890625008143, 0, 1], 0, 0, 1, [1, 1.8369701987210297e-16, 0, 0, -1.8369701987210297e-16, 1, 0, 0, 0, 0, 1, 0, 84.0663826298624, 29.997890625008143, 0, 1], 0, 0, 1, 2, 6, [51.327397755710166, 8.9999999999999], 0, [76.44091661722764, 52.49789062498048], 0, [51.327397755698925, 95.99578124997062], 0, [1.09445458902535, 95.99578124997072], 0, [-22.143756126866503, 55.746019613071404], 0.02750377742868334, [4.842938509491432, 9.000000000000057], 0, true, 0, "Region", 10, 2, 114, 0, 1, 2, 71, [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, 1, 1, 1, 1, "Polyline", 10, 2, 0, 0, 0, 7, 71, [1, 1.8369701987210297e-16, 1.8369701987210297e-16, 0, -1.8369701987210297e-16, 1, -3.374459510989179e-32, 0, -1.8369701987210297e-16, 0, 1, 0, 66.97552158763568, 82.49578124998891, 0, 1], 0, 0, 1, [1, 1.8369701987210297e-16, 1.8369701987210297e-16, 0, -1.8369701987210297e-16, 1, -3.374459510989179e-32, 0, -1.8369701987210297e-16, 0, 1, 0, 66.97552158763568, 82.49578124998891, 0, 1], 0, 0, 1, 2, 6, [19.91736643882509, -40.4978906249944], 0, [66.68620799036073, -40.49789062499439], 0, [90.06767604432, -3.986144747614162e-12], 0, [66.68620799036296, 40.49789062500167], 0, [19.917366438823027, 40.49789062500167], 0, [-3.4641016151380235, -2.1316282072803006e-13], 0, true, 0], "basePt": { "x": 61.922626502995854, "y": 38.997890625008054, "z": -6.363451432349935e-16 }, "ucs": [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 298.994974874372, 121.44053601340033, 0, 1] };
let regs = LoadRegionsFromFileData(d.file);
regs[0].BooleanOper(regs[1], BoolOpeartionType.Subtract);
expect(regs[0].ShapeManager.ShapeCount).toMatchNumberSnapshot(0);
expect(regs[0].Area).toMatchNumberSnapshot();
});