import { Vector2, Vector3 } from 'three'; import { Polyline } from '../../src/DatabaseServices/Polyline'; import { equal, equaln } from '../../src/Geometry/GeUtils'; 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()).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)) }) })