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/polyline.test.ts

532 lines
15 KiB

import { Vector2, Vector3 } from 'three';
import { Polyline } from '../../src/DatabaseServices/Polyline';
import { equal, equaln } from '../../src/Geometry/GeUtils';
import { CADFile } from '../../src/DatabaseServices/CADFile';
test("多段线点获取参数", () =>
{
let pl = new Polyline([
{
pt: new Vector2(0, 0),
bul: 0
},
{
pt: new Vector2(5, 0),
bul: 1
},
{
pt: new Vector2(5, 5),
bul: -1
},
{
pt: new Vector2(5, 10),
bul: 0
},
{
pt: new Vector2(0, 10),
bul: 0
},
{
pt: new Vector2(0, 0),
bul: 0
}
])
expect(pl.GetParamAtPoint(new Vector3(5, 0, 0))).toBe(1);
expect(pl.GetParamAtPoint(new Vector3(6, 0, 0)) /*?*/).toBe(NaN);
expect(pl.GetParamAtPoint(new Vector3(-2.5, 0, 0))/*?*/).toBe(-0.5);
expect(pl.GetParamAtPoint(new Vector3(7.5, 2.5, 0))).toBe(1.5);
expect(pl.GetParamAtPoint(new Vector3(5, 5, 0))).toBe(2);
expect(pl.GetParamAtPoint(pl.GetPointAtParam(1.25)) /*?*/).toBe(1.25);
expect(equaln(pl.GetParamAtPoint(new Vector3(0, 5, 0)), 4.5)).toBeTruthy();
expect(pl.GetParamAtPoint(new Vector3(0, -5, 0))).toBe(5.5);
expect(pl.GetParamAtPoint(new Vector3(0, 10, 0))).toBe(4);
let pl2 = new Polyline([
{
pt: new Vector2(1.5, 8.5),
bul: 0
},
{
pt: new Vector2(1.5, 1.5),
bul: 0
}
])
expect(pl2.GetParamAtPoint(new Vector3(1.5, 5))).toBe(0.5)
})
describe('多段线', () =>
{
test("多段线参数获取点", () =>
{
let pl = new Polyline([
{
pt: new Vector2(0, 0),
bul: 0
},
{
pt: new Vector2(5, 0),
bul: 1
},
{
pt: new Vector2(5, 5),
bul: -1
},
{
pt: new Vector2(5, 10),
bul: 0
},
{
pt: new Vector2(0, 10),
bul: 0
},
{
pt: new Vector2(0, 0),
bul: 0
}
])
expect(equal(pl.GetPointAtParam(1), new Vector3(5, 0, 0))).toBeTruthy();
expect(equal(pl.GetPointAtParam(0.5), new Vector3(2.5, 0, 0))).toBeTruthy();
expect(equal(pl.GetPointAtParam(-0.5), new Vector3(-2.5, 0, 0))).toBeTruthy();
expect(equal(pl.GetPointAtParam(4.5), new Vector3(0, 5, 0))).toBeTruthy();
expect(equal(pl.GetPointAtParam(5), new Vector3(0, 0, 0))).toBeTruthy();
expect(equal(pl.GetPointAtParam(5.5), new Vector3(0, -5, 0))).toBeTruthy();
})
test("多段线参数获取弧长", () =>
{
let pl = new Polyline([
{
pt: new Vector2(0, 0),
bul: 0
},
{
pt: new Vector2(5, 0),
bul: 1
},
{
pt: new Vector2(5, 5),
bul: -1
},
{
pt: new Vector2(5, 10),
bul: 0
},
{
pt: new Vector2(0, 10),
bul: 0
},
{
pt: new Vector2(0, 0),
bul: 0
}
])
expect(pl.GetDistAtParam(1)).toBe(5);
expect(pl.GetDistAtParam(2)).toBe(5 + Math.PI * 2.5);
expect(pl.GetDistAtParam(1.5)).toBe(5 + Math.PI * 2.5 / 2);
expect(pl.GetDistAtParam(3)).toBe(5 + Math.PI * 5);
expect(pl.GetDistAtParam(4)).toBe(5 + Math.PI * 5 + 5);
expect(pl.GetDistAtParam(3.5)).toBe(5 + Math.PI * 5 + 2.5);
})
test("多段线弧长获取点", () =>
{
let pl = new Polyline([
{
pt: new Vector2(0, 0),
bul: 0
},
{
pt: new Vector2(5, 0),
bul: 1
},
{
pt: new Vector2(5, 5),
bul: -1
},
{
pt: new Vector2(5, 10),
bul: 0
},
{
pt: new Vector2(0, 10),
bul: 0
},
{
pt: new Vector2(0, 0),
bul: 0
}
])
expect(equal(pl.GetPointAtDistance(5), new Vector3(5, 0, 0))).toBeTruthy();
expect(equal(pl.GetPointAtDistance(2.5), new Vector3(2.5, 0, 0))).toBeTruthy();
expect(equal(pl.GetPointAtDistance(5 + Math.PI * 2.5), new Vector3(5, 5, 0))).toBeTruthy();
expect(equal(pl.GetPointAtDistance(5 + Math.PI * 2.5 * 2), new Vector3(5, 10, 0))).toBeTruthy();
expect(equal(pl.GetPointAtDistance(0), new Vector3(0, 0, 0))).toBeTruthy();
})
test("多段线距离获取参数", () =>
{
let pl = new Polyline([
{
pt: new Vector2(0, 0),
bul: 0
},
{
pt: new Vector2(5, 0),
bul: 1
},
{
pt: new Vector2(5, 5),
bul: -1
},
{
pt: new Vector2(5, 10),
bul: 0
},
{
pt: new Vector2(0, 10),
bul: 0
},
{
pt: new Vector2(0, 0),
bul: 0
}
])
expect(pl.GetParamAtDist(5)).toBe(1);
expect(pl.GetParamAtDist(5 + Math.PI * 2.5)).toBe(2);
expect(pl.GetParamAtDist(5 + Math.PI * 2.5 / 2)).toBe(1.5);
})
test("多段线点获取弧长", () =>
{
let pl = new Polyline([
{
pt: new Vector2(0, 0),
bul: 0
},
{
pt: new Vector2(5, 0),
bul: 1
},
{
pt: new Vector2(5, 5),
bul: -1
},
{
pt: new Vector2(5, 10),
bul: 0
},
{
pt: new Vector2(0, 10),
bul: 0
},
{
pt: new Vector2(0, 0),
bul: 0
}
])
expect(pl.GetDistAtPoint(new Vector3(0, 0, 0))).toBe(0);
expect(pl.GetDistAtPoint(new Vector3(5, 0, 0))).toBe(5);
expect(pl.GetDistAtPoint(new Vector3(7.5, 2.5, 0))).toBe(5 + Math.PI / 2 * 2.5);
expect(pl.GetDistAtPoint(new Vector3(7.5, 2.5, 0))).toBe(5 + Math.PI / 2 * 2.5);
expect(equaln(pl.Length, 20 + 2 * Math.PI * 2.5)).toBeTruthy();
})
test("多段线延伸,不闭合", () =>
{
let pl = new Polyline([
{
pt: new Vector2(0, 0),
bul: 0
},
{
pt: new Vector2(5, 0),
bul: 1
},
{
pt: new Vector2(5, 5),
bul: -1
},
{
pt: new Vector2(5, 10),
bul: 0
},
{
pt: new Vector2(0, 10),
bul: 0
},
{
pt: new Vector2(0, 0),
bul: 0
}
])
let pl2 = new Polyline([
{
pt: new Vector2(0, 0),
bul: 0
},
{
pt: new Vector2(5, 0),
bul: 1
},
{
pt: new Vector2(5, 5),
bul: -1
},
{
pt: new Vector2(5, 10),
bul: 0
},
{
pt: new Vector2(0, 10),
bul: 0
}
])
expect(pl.IsClose).toBeTruthy();
pl.Extend(5.5);
expect(pl.EndPoint).toEqual(new Vector3(0, -5, 0));
expect(pl.LineData.length).toEqual(6);
expect(pl.GetPointAtParam(5)).toEqual(new Vector3(0, -5, 0));
pl.Extend(-0.5);
expect(pl.StartPoint).toEqual(new Vector3(-2.5, 0, 0));
expect(pl.IsClose).toBeFalsy();
pl2.Extend(4.5)
expect(pl2.EndPoint).toEqual(new Vector3(-2.5, 10, 0));
pl2.Extend(-0.5)
expect(pl2.EndPoint).toEqual(new Vector3(-2.5, 10, 0));
expect(pl2.StartPoint).toEqual(new Vector3(-2.5, 0, 0));
let pl3 = new Polyline([
{
pt: new Vector2(0, 0),
bul: 1
},
{
pt: new Vector2(0, 5),
bul: 0
}
])
pl3.Extend(1.5);
expect(equal(pl3.EndPoint, new Vector3(-2.5, 2.5, 0))).toBeTruthy();
pl3.Extend(1 + 1 / 3);
// expect(pl3.EndPoint).toEqual(new Vector3(0, 0, 0));
expect(equal(pl3.EndPoint /*?*/, new Vector3(0, 0, 0))).toBeTruthy();
})
test("多段线延伸,闭合", () =>
{
let pl = new Polyline([
{
pt: new Vector2(0, 0),
bul: 0
},
{
pt: new Vector2(5, 0),
bul: 1
},
{
pt: new Vector2(5, 5),
bul: -1
},
{
pt: new Vector2(5, 10),
bul: 0
},
{
pt: new Vector2(0, 10),
bul: 0
},
{
pt: new Vector2(0, 0),
bul: 0
}
])
pl.CloseMark = true;
pl.Extend(5.5);
expect(pl.EndPoint).toEqual(new Vector3());
})
test("多段线点在线上", () =>
{
let pl = new Polyline([
{
pt: new Vector2(0, 0),
bul: 0
},
{
pt: new Vector2(5, 0),
bul: 1
},
{
pt: new Vector2(5, 5),
bul: -1
},
{
pt: new Vector2(5, 10),
bul: 0
},
{
pt: new Vector2(0, 10),
bul: 0
},
{
pt: new Vector2(0, 0),
bul: 0
}
])
expect(pl.GetParamAtPoint(new Vector3())).toBe(0);
expect(pl.PtOnCurve(new Vector3(0, 0, 0))).toBeTruthy();
expect(pl.PtOnCurve(new Vector3(5, 0, 0))).toBeTruthy();
expect(pl.PtOnCurve(new Vector3(7.5, 2.5, 0))).toBeTruthy();
expect(pl.PtOnCurve(new Vector3(7.5, 3.5, 0))).toBeFalsy();
})
test("多段线最近点", () =>
{
let pl = new Polyline([
{
pt: new Vector2(0, 0),
bul: 0
},
{
pt: new Vector2(5, 0),
bul: 1
},
{
pt: new Vector2(5, 5),
bul: -1
},
{
pt: new Vector2(5, 10),
bul: 0
},
{
pt: new Vector2(0, 10),
bul: 0
},
{
pt: new Vector2(0, 0),
bul: 0
}
])
expect(pl.GetClosestPointTo(new Vector3(), true)).toEqual(new Vector3());
expect(pl.GetClosestPointTo(new Vector3(3.5, 2.5), true)).toEqual(new Vector3(3.5, 0, 0));
expect(pl.GetClosestPointTo(new Vector3(1.5, 3.5), true)).toEqual(new Vector3(0, 3.5, 0));
expect(equal(pl.GetClosestPointTo(new Vector3(1.5, 3.5), true), new Vector3(0, 3.5, 0))).toBeTruthy();
expect(equal(pl.GetClosestPointTo(new Vector3(-0.5, -1), true), new Vector3(0, -1, 0))).toBeTruthy();
})
test("多段线包围盒", () =>
{
let pl = new Polyline([
{
pt: new Vector2(0, 0),
bul: 0
},
{
pt: new Vector2(5, 0),
bul: 1
},
{
pt: new Vector2(5, 5),
bul: -1
},
{
pt: new Vector2(5, 10),
bul: 0
},
{
pt: new Vector2(0, 10),
bul: 0
},
{
pt: new Vector2(0, 0),
bul: 0
}
])
expect(pl.BoundingBox.getSize(new Vector3())).toEqual(new Vector3(7.5, 10, 0))
})
test("多段线反转", () =>
{
let pl = new Polyline([
{
pt: new Vector2(0, 0),
bul: 0
},
{
pt: new Vector2(5, 0),
bul: 1
},
{
pt: new Vector2(5, 5),
bul: -1
},
{
pt: new Vector2(5, 10),
bul: 0
},
{
pt: new Vector2(0, 10),
bul: 0
}
])
pl.Reverse();
expect(pl.StartPoint).toEqual(new Vector3(0, 10, 0))
})
//直线和圆的求交的det精度不能为0.1 太大了.请保证这个测试是通过的
test('最近点精度', () =>
{
let f = new CADFile();
f.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, 5, [0, 0], 0, [2, 0], 1, [2, 2], -1, [2, 4], 0, [0, 4], 0, true]]
f.Read();
let pl = f.ReadObject() as Polyline;
pl.Reverse();
let cp = pl.GetClosestPointTo(new Vector3(2 - 1e-2, 3.8), false);
expect(cp).toMatchSnapshot();
});
test('优化参数在端点上的时候', () =>
{
let pl = new Polyline();
pl.AddVertexAt(0, new Vector2(0, 0));
pl.AddVertexAt(1, new Vector2(5, 0));
pl.AddVertexAt(2, new Vector2(5, 5));
pl.CloseMark = true;
let p = pl.GetPointAtParam(3);
expect(p).toMatchSnapshot();
});
test('存在大圆弧的多段线面积', () =>
{
let f = new CADFile();
f.Data =
[1, ["Polyline", 1, 1, 1606, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -19.17745164184445, -6.335408131680751, 0, 1], 2, 5, [11.884352072596577, -75.64730611519322], -1.9523252757782086, [16.25360183965801, -70.58112080246555], 0, [14.621427950114992, -70.9720172143345], 1.8583004340984604, [11.834326201222096, -73.95002751582643], 0, [11.884352072596577, -75.64730611519322], 0, false]]
f.Read();
let pl = f.ReadObject() as Polyline;
expect(pl.Area2).toMatchSnapshot();
});
})
test('最近点参数刚好在端点上', () =>
{
let f = new CADFile();
f.Data = [1, ["Polyline", 1, 1, 11, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 15.725529745042493, -3.9968028886505635e-15, 0, 1], 2, 3, [13.07875354107649, 3.8181303116147296], 0, [18.159206798866855, 3.8181303116147296], 0.664293193717279, [18.159206798866855, -1.4844192634560907], -0.10977222864644352, false]];
f.Read();
let pl = f.ReadObject() as Polyline;
let p = new Vector3(33.88473654390935, 3.8181303116147256, 0);
let cp = pl.GetClosestPointTo(p, false);
let param = pl.GetParamAtPoint(cp);
expect(equaln(param, 1)).toBeTruthy();
});