|
|
|
import { Vector3 } from 'three';
|
|
|
|
import { Arc } from '../../src/DatabaseServices/Entity/Arc';
|
|
|
|
import { equaln, equalv3 } from '../../src/Geometry/GeUtils';
|
|
|
|
import { Status } from '../../src/Common/Status';
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
|
|
|
expect(arc.Center).toMatchSnapshot();
|
|
|
|
expect(arc.StartAngle).toMatchSnapshot();
|
|
|
|
expect(arc.EndAngle).toMatchSnapshot();
|
|
|
|
expect(arc.Radius).toMatchSnapshot();
|
|
|
|
});
|
|
|
|
|
|
|
|
test("三点圆心", () =>
|
|
|
|
{
|
|
|
|
let arc = new Arc();
|
|
|
|
arc.FromThreePoint(
|
|
|
|
new Vector3(0, 0, 0),
|
|
|
|
new Vector3(5, 5, 0),
|
|
|
|
new Vector3(10, 0, 0)
|
|
|
|
);
|
|
|
|
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)
|
|
|
|
);
|
|
|
|
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(equalv3(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)).toBe(Status.ConverToCircle);
|
|
|
|
|
|
|
|
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, 0.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)).toBe(Status.ConverToCircle);
|
|
|
|
});
|