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__/Line/line.test.ts

217 lines
6.1 KiB

import { Line } from '../../src/DatabaseServices/Entity/Line';
import { Vector3 } from 'three';
test('直线参数', () =>
{
let l = new Line(new Vector3(0, 0, 0), new Vector3(5, 5, 0));
expect(l.GetParamAtPoint(new Vector3(0, 0, 0))).toBe(0);
expect(l.GetParamAtPoint(new Vector3(5, 5, 0))).toBe(1);
expect(l.GetParamAtPoint(new Vector3(-5, -5, 0))).toMatchSnapshot();
expect(l.GetParamAtPoint(new Vector3(10, 10, 0))).toMatchSnapshot();
expect(l.GetParamAtPoint(new Vector3(11, 10, 0))).toBe(NaN);
});
test('0长度直线,参数', () =>
{
let l = new Line(new Vector3(), new Vector3());
expect(l.GetParamAtPoint(new Vector3(0, 0, 0))).toBe(0);
expect(l.GetParamAtPoint(new Vector3(1, 0, 0))).toBe(NaN);
});
test("直线的切割1", () =>
{
let l = new Line(new Vector3(0, 0, 0), new Vector3(5, 0, 0));
expect(l.GetSplitCurves(0.5)[0].EndPoint).toMatchObject({ 'x': 2.5, 'y': 0, 'z': 0 });
expect(l.GetSplitCurves(0.5)[1].EndPoint).toMatchObject({ 'x': 5, 'y': 0, 'z': 0 });
});
test("直线的切割2", () =>
{
let l = new Line(new Vector3(0, 0, 0), new Vector3(5, 0, 0));
expect(l.GetSplitCurves([0.5, 0.2, 0.8])[0].EndPoint).toMatchObject({ 'x': 1, 'y': 0, 'z': 0 });
expect(l.GetSplitCurves([0.2, 0.5, 0.8])[1].StartPoint).toMatchObject({ 'x': 1, 'y': 0, 'z': 0 });
expect(l.GetSplitCurves([0.2, 0.5, 0.8]).length).toBe(4);
});
test("直线延伸-反向", () =>
{
let l = new Line(new Vector3(0, 0, 0), new Vector3(5, 0, 0));
l.Extend(-1);
expect(l.StartPoint).toMatchObject({ 'x': -5, 'y': 0, 'z': 0 });
});
test("直线延伸-正向", () =>
{
let l = new Line(new Vector3(0, 0, 0), new Vector3(5, 0, 0));
l.Extend(2);
expect(l.EndPoint).toMatchObject({ 'x': 10, 'y': 0, 'z': 0 });
});
test("由距离得到直线参数", () =>
{
let l = new Line(new Vector3(0, 0, 0), new Vector3(5, 0, 0));
expect(l.GetParamAtDist(10)).toBe(2);
}
);
test("由距离得到对应点", () =>
{
let l = new Line(new Vector3(0, 0, 0), new Vector3(5, 0, 0));
expect(l.GetPointAtDistance(-10)).toMatchObject({ "x": -10, 'y': 0, 'z': 0 });
}
);
test("由参数得到距离", () =>
{
let l = new Line(new Vector3(0, 0, 0), new Vector3(5, 0, 0));
expect(l.GetDistAtParam(-2)).toBe(-10);
}
);
test("由点得到距离", () =>
{
let l = new Line(new Vector3(0, 0, 0), new Vector3(5, 0, 0));
expect(l.GetDistAtPoint(new Vector3(-10, 0, 0))).toBe(-10);
expect(l.GetDistAtPoint(new Vector3(10, 0, 0))).toBe(10);
}
);
test('直线偏移', () =>
{
let l = new Line(new Vector3(0, 0, 0), new Vector3(5, 0, 0));
let lines = l.GetOffsetCurves(-10);
expect(lines.length).toBe(1);
let newLine = lines[0];
expect(newLine.StartPoint).toMatchSnapshot();
expect(newLine.EndPoint).toMatchSnapshot();
let l2 = new Line(new Vector3(0, 0, 0), new Vector3(5, 5, 0));
let lines2 = l2.GetOffsetCurves(-10)[0]; //?
lines2.StartPoint; //?
lines2.EndPoint; //?
expect(lines2.StartPoint).toMatchSnapshot();
expect(lines2.EndPoint).toMatchSnapshot();
lines2 = l2.GetOffsetCurves(10)[0]; //?
lines2.StartPoint; //?
lines2.EndPoint; //?
expect(lines2.StartPoint).toMatchSnapshot();
expect(lines2.EndPoint).toMatchSnapshot();
l2.EndPoint = l2.EndPoint.negate();
lines2 = l2.GetOffsetCurves(10)[0]; //?
lines2.StartPoint; //?
lines2.EndPoint; //?
expect(lines2.StartPoint).toMatchSnapshot();
expect(lines2.EndPoint).toMatchSnapshot();
lines2 = l2.GetOffsetCurves(-10)[0]; //?
lines2.StartPoint; //?
lines2.EndPoint; //?
expect(lines2.StartPoint).toMatchSnapshot();
expect(lines2.EndPoint).toMatchSnapshot();
});
test('最近点', () =>
{
let l = new Line(new Vector3(0, 0, 0), new Vector3(5, 5, 0));
expect(l.GetClosestPointTo(new Vector3(-5, 0, 0), true)/*?*/).toMatchSnapshot();//-5,0,0.
expect(l.GetClosestPointTo(new Vector3(-5, 0, 0), false)/*?*/).toMatchSnapshot();//0,0,0.
});
test('拉伸直线的夹点', () =>
{
let line = new Line(new Vector3(0, 0, 0), new Vector3(10, 0, 0));
//测试拉伸一个参数
line.MoveStretchPoints([0], new Vector3(0, 5, 0));
expect(line.StartPoint.toArray()).toMatchObject([0, 5, 0]);
//测试同时拉伸2个点的情况下
line.MoveStretchPoints([0, 1], new Vector3(0, 5, 0));
expect(line.StartPoint /*?*/).toMatchSnapshot();
expect(line.EndPoint /*?*/).toMatchSnapshot();
line.MoveStretchPoints([1], new Vector3(5, 0, 0));
expect(line.StartPoint).toMatchSnapshot();
expect(line.EndPoint).toMatchSnapshot();
});
test('直线合并', () =>
{
let l1 = new Line(new Vector3(0), new Vector3(10));
let l2 = new Line(new Vector3(0), new Vector3(0));
//L1 -----------
//L2 --
l2.StartPoint = new Vector3(-5);
l2.EndPoint = new Vector3(-3);
expect(l1.Join(l2)).toBeFalsy();
//L1 -----------
//L2 -----------
l2.StartPoint = new Vector3(-5);
l2.EndPoint = new Vector3(5);
expect(l1.Join(l2)).toBeTruthy();
//L1 -----------
//L2 ----
l2.StartPoint = new Vector3(2);
l2.EndPoint = new Vector3(5);
expect(l1.Join(l2)).toBeTruthy();
//L1 -----------
//L2 ----
l2.StartPoint = new Vector3(9);
l2.EndPoint = new Vector3(12);
expect(l1.Join(l2)).toBeTruthy();
//L1 -----------
//L2 ----
l2.StartPoint = new Vector3(15);
l2.EndPoint = new Vector3(12);
expect(l1.Join(l2)).toBeTruthy();
//L1 -----------
//L2 ---------------------
l2.StartPoint = new Vector3(-2);
l2.EndPoint = new Vector3(12);
expect(l1.Join(l2)).toBeTruthy();
});
test('直线合并容差', () =>
{
let l1 = new Line(new Vector3(0), new Vector3(10));
let l2 = new Line(new Vector3(10 + 1e-6), new Vector3(15));
expect(l1.Join(l2)).toBeTruthy();
l2 = new Line(new Vector3(-10), new Vector3(0 - 1e-5));
expect(l1.Join(l2, true, 1e-6)).toBeTruthy();
});
test('直线合并不平行', () =>
{
let l1 = new Line(new Vector3(0, 0, 0), new Vector3(0, 5, 0));
let l2 = new Line(new Vector3(1, 10, 0), new Vector3(0, 5, 0));
expect(l1.Join(l2)).toBeFalsy();
});