import { Arc } from '../../src/DatabaseServices/Arc'; import { Vector3, Vector2 } from 'three'; import { app } from '../../src/ApplicationServices/Application'; import { Command } from '../../src/Editor/CommandMachine'; import { PromptStatus } from '../../src/Editor/PromptResult'; import { RenderType } from '../../src/GraphicsSystem/Enum'; import { equal, equaln } from '../../src/Geometry/GeUtils'; test("三点共线", () => { let pt1 = new Vector3(0, 0, 0); let pt2 = new Vector3(0, 1, 0); let pt3 = new Vector3(0, 2, 0); let arc = new Arc(); arc.FromThreePoint(pt1, pt2, pt3); console.log(arc.Center); console.log(arc.StartAngle); console.log(arc.EndAngle); console.log(arc.Radius); expect(arc.Center.toArray()).toMatchObject([0, 0, 0]); }) test("三点圆心", () => { let arc = new Arc(); arc.FromThreePoint( new Vector3(0, 0, 0), new Vector3(5, 5, 0), new Vector3(10, 0, 0) ) console.log(arc.StartAngle); console.log(arc.EndAngle); expect(arc.Center.toArray()).toMatchObject([5, 0, 0]); expect(arc.StartAngle).toMatchSnapshot(); expect(arc.EndAngle).toMatchSnapshot(); }) test("三点同一位置", () => { let arc = new Arc(); arc.FromThreePoint( new Vector3(5, 5, 0), new Vector3(5, 5, 0), new Vector3(5, 5, 0) ) console.log(arc.StartAngle); console.log(arc.EndAngle); expect(arc.Center.toArray()).toMatchObject([5, 5, 0]); expect(arc.StartAngle).toMatchSnapshot(); expect(arc.EndAngle).toMatchSnapshot(); }) test('圆弧参数', () => { let arc = new Arc(new Vector3(5, 0, 0), 5, Math.PI, 0); expect(arc.GetParamAtPoint(new Vector3(0, 0, 0))).toBe(0); expect(equaln(arc.GetParamAtPoint(new Vector3(5, 5, 0)), 0.5)).toBeTruthy(); expect(equaln(arc.GetParamAtPoint(new Vector3(10, 0, 0)), 1)).toBeTruthy(); expect(equaln(arc.GetParamAtPoint(new Vector3(5, -5, 0)), 1.5)).toBeTruthy(); }); test('0长度圆弧,参数', () => { let arc = new Arc(new Vector3(), 0, 0, 0); expect(arc.GetParamAtPoint(new Vector3(0, 0, 0))).toBe(NaN); }); test("圆弧的切割1", () => { let arc = new Arc(new Vector3(5, 0, 0), 5, Math.PI, 0); expect(arc.GetSplitCurves(0.5)[0].EndPoint).toMatchObject({ 'x': 5, 'y': 5, 'z': 0 }); expect(arc.GetSplitCurves(0.5)[1].EndPoint).toMatchObject({ 'x': 10, 'y': 0, 'z': 0 }); }); test("圆弧的切割2", () => { let arc = new Arc(new Vector3(5, 0, 0), 5, Math.PI, 0); expect(arc.GetSplitCurves([0.5, 0.8, 0.2])[0].StartPoint.distanceTo(new Vector3(0, 0, 0)) < 0.01).toBeTruthy(); expect(arc.GetSplitCurves([0.5, 0.2, 0.8])[1].EndPoint.distanceTo(new Vector3(5, 5, 0)) < 0.01).toBeTruthy(); expect(arc.GetSplitCurves([0.2, 0.5, 0.8]).length).toBe(4); }); test('圆弧切割参数重复', () => { let arc = new Arc(new Vector3(5, 0, 0), 5, Math.PI, 0); let arcs = arc.GetSplitCurves([0, 1e-8, 0.5, 1, 1 + 1e-8]); expect(arcs.length).toMatchSnapshot(); }); test("圆弧延伸-反向", () => { let arc = new Arc(new Vector3(5, 0, 0), 5, Math.PI, 0); arc.Extend(-0.5); expect(arc.StartPoint.distanceTo(new Vector3(5, -5, 0)) < 0.01).toBeTruthy(); }); test("圆弧延伸-正向", () => { let arc = new Arc(new Vector3(5, 0, 0), 5, Math.PI, 0); arc.Extend(1.5); expect(arc.EndPoint.distanceTo(new Vector3(5, -5, 0)) < 0.01).toBeTruthy(); }); test("由距离得到圆弧参数", () => { let arc = new Arc(new Vector3(5, 0, 0), 5, Math.PI, 0); expect(equaln(arc.GetParamAtDist(0.25 * Math.PI * 5), 0.25)).toBeTruthy(); } ); test("由距离得到对应点", () => { let arc = new Arc(new Vector3(5, 0, 0), 5, Math.PI, 0); expect(equal(arc.GetPointAtDistance(0.5 * Math.PI * 5), new Vector3(5, 5, 0))).toBeTruthy(); } ); test("由参数得到距离", () => { let arc = new Arc(new Vector3(5, 0, 0), 5, Math.PI, 0); equaln(arc.GetDistAtParam(0.5), 0.5 * Math.PI * 5) expect(equaln(arc.GetDistAtParam(0.5), 0.5 * Math.PI * 5)).toBeTruthy(); } ); test("由点得到距离", () => { let arc = new Arc(new Vector3(5, 0, 0), 5, Math.PI, 0); expect(equaln(arc.GetDistAtPoint(new Vector3(5, 5, 0)), 0.5 * Math.PI * 5)).toBeTruthy(); expect(arc.GetDistAtPoint(new Vector3(10, 0, 0))).toBe(Math.PI * 5); } ); test('圆弧偏移', () => { let arc = new Arc(new Vector3(5, 0, 0), 5, Math.PI, 0); for (let d of [0, -10, 20]) { let arcs = arc.GetOffsetCurves(d); for (let a of arcs) { expect(a.Center).toMatchSnapshot(); expect(a.StartAngle).toMatchSnapshot(); expect(a.EndAngle).toMatchSnapshot(); expect(a.Radius).toMatchSnapshot(); } } arc.Reverse(); for (let d of [0, -10, 20]) { let arcs = arc.GetOffsetCurves(d); for (let a of arcs) { expect(a.Center).toMatchSnapshot(); expect(a.StartAngle).toMatchSnapshot(); expect(a.EndAngle).toMatchSnapshot(); expect(a.Radius).toMatchSnapshot(); } } }); test('最近点', () => { let arc = new Arc(new Vector3(5, 0, 0), 5, Math.PI, 0); expect(arc.GetClosestPointTo(new Vector3(-5, 0, 0), true)/*?*/).toMatchSnapshot();//0,0,0. expect(arc.GetClosestPointTo(new Vector3(8, 0, 0), true)/*?*/).toMatchSnapshot();//0,0,0. }); test('圆弧合并', () => { let arc = new Arc(new Vector3(), 1, 0, 1); let arc2 = new Arc(new Vector3(), 1, 3, 4); //成了一个圆 expect(arc.Join(arc2)).toBeTruthy(); expect(equaln(arc.AllAngle, Math.PI * 2)).toBeTruthy(); arc = new Arc(new Vector3(), 1, 0, 1).Reverse(); arc2 = new Arc(new Vector3(), 1, 0.5, 0.2).Reverse(); expect(arc.Join(arc2)).toBeFalsy(); //终点捅了进去 arc = new Arc(new Vector3(), 1, 0, 1).Reverse(); arc2 = new Arc(new Vector3(), 1, 0.5, 5).Reverse(); expect(arc.Join(arc2)).toBeTruthy(); expect(arc.StartAngle).toMatchSnapshot(); expect(arc.EndAngle).toMatchSnapshot(); //包含. arc = new Arc(new Vector3(), 1, 0, 1).Reverse(); arc2 = new Arc(new Vector3(), 1, 5, 3); expect(arc.Join(arc2)).toBeTruthy(); arc.Reverse(); expect(arc.StartAngle).toBe(0); expect(arc.EndAngle).toBe(1); //起点捅了进去 arc2 = new Arc(new Vector3(), 1, 3, 0.5).Reverse(); expect(arc.Join(arc2)).toBeTruthy(); expect(arc.StartAngle).toBe(0); expect(arc.EndAngle).toBe(0.5); //被包含 arc = new Arc(new Vector3(), 1, 0, 1).Reverse(); arc2 = new Arc(new Vector3(), 1, 0.5, 0.8); expect(arc.Join(arc2)).toBeTruthy(); arc.Reverse(); expect(arc.StartAngle).toBe(0.5); expect(arc.EndAngle).toBe(0.8); //容差允许 arc = new Arc(new Vector3(), 1, 0, 1); arc2 = new Arc(new Vector3(), 1, 0.5, 1e-6).Reverse(); expect(arc.Join(arc2)).toBeTruthy(); expect(arc.StartAngle).toBe(0.5); expect(arc.EndAngle).toBe(1); }); test('容差相接', () => { let arc = new Arc(new Vector3(), 1, 0, 1); let arc2 = new Arc(new Vector3(), 1, 1 + 1e-5, 0.5); //终点对起点 expect(arc.Join(arc2)).toBeTruthy(); expect(arc.EndAngle).toBe(0.5); //起点对终点 arc2.EndAngle = 0 + 1e-5; expect(arc.Join(arc2)).toBeTruthy(); expect(equaln(arc.AllAngle, Math.PI * 2)); arc.StartAngle = 0; arc.EndAngle = 1; arc2.StartAngle = 0; arc2.EndAngle = 0.5; expect(arc.Join(arc2)).toBeTruthy(); arc.StartAngle //? expect(arc.EndAngle).toBe(0.5); //终点对起点 arc.StartAngle = 0; arc.EndAngle = 1; arc2.StartAngle = 0.5; arc2.EndAngle = 1; expect(arc.Join(arc2)).toBeTruthy(); //起点对起点 arc.StartAngle = 0; arc.EndAngle = 1; arc2.StartAngle = 1; arc2.EndAngle = 0; expect(arc.Join(arc2)).toBeTruthy(); expect(arc.AllAngle).toBe(Math.PI * 2); });