mirror of
https://gitee.com/antv/g6.git
synced 2024-12-02 11:48:29 +08:00
209 lines
5.2 KiB
TypeScript
209 lines
5.2 KiB
TypeScript
import {
|
|
getControlPoint,
|
|
getSpline,
|
|
pointsToPolygon,
|
|
pathToPoints,
|
|
getClosedSpline,
|
|
roundedHull,
|
|
paddedHull
|
|
} from '../../../src/util/path';
|
|
|
|
describe('Path Util Test', () => {
|
|
it('getSpline', () => {
|
|
const points = [
|
|
{
|
|
x: 10,
|
|
y: 12,
|
|
},
|
|
{
|
|
x: 5,
|
|
y: 5,
|
|
},
|
|
{
|
|
x: 2,
|
|
y: 7,
|
|
},
|
|
];
|
|
|
|
const splinePath = getSpline(points);
|
|
|
|
expect(splinePath.length).toEqual(3);
|
|
const first = splinePath[0];
|
|
expect(first.length).toEqual(3);
|
|
expect(first[0]).toEqual('M');
|
|
expect(first[1]).toEqual(10);
|
|
expect(first[2]).toEqual(12);
|
|
|
|
const second = splinePath[1];
|
|
expect(second.length).toEqual(7);
|
|
expect(second[0]).toEqual('C');
|
|
expect(second[1]).toEqual(9.166666666666666);
|
|
expect(second[2]).toEqual(10.833333333333334);
|
|
expect(second[5]).toEqual(5);
|
|
|
|
const three = splinePath[2];
|
|
expect(three.length).toEqual(7);
|
|
expect(three[2]).toEqual(4.166666666666667);
|
|
expect(three[6]).toEqual(7);
|
|
});
|
|
|
|
it('getSpline thorw new error', () => {
|
|
const points = [
|
|
{
|
|
x: 10,
|
|
y: 12,
|
|
},
|
|
];
|
|
|
|
expect(() => getSpline(points)).toThrowError(
|
|
`point length must largn than 2, now it's ${points.length}`,
|
|
);
|
|
});
|
|
|
|
it('getControlPoint horizontal', () => {
|
|
const start = { x: 0, y: 0 };
|
|
const end = { x: 100, y: 0 };
|
|
|
|
const controlPoint = getControlPoint(start, end, 0.5, 10);
|
|
|
|
expect(controlPoint.x).toEqual(50);
|
|
expect(controlPoint.y).toEqual(10);
|
|
|
|
const points = getControlPoint(start, end, 0.2, -2);
|
|
expect(points).toEqual({ x: 20, y: -2 });
|
|
});
|
|
|
|
it('getControlPoint vertical', () => {
|
|
const start = { x: 0, y: 0 };
|
|
const end = { x: 0, y: 100 };
|
|
|
|
const point = getControlPoint(start, end, 0.5);
|
|
expect(point).toEqual({ x: 0, y: 50 });
|
|
|
|
const point2 = getControlPoint(start, end, 0.2, -2);
|
|
expect(point2).toEqual({ x: 2, y: 20 });
|
|
});
|
|
|
|
it('getControlPoint 45', () => {
|
|
const start = { x: 0, y: 0 };
|
|
const end = { x: 100, y: 100 };
|
|
const point = getControlPoint(start, end, 0.5, 10);
|
|
const sqrt2 = Math.sqrt(2);
|
|
expect(point.x).toEqual(50 - (sqrt2 * 10) / 2);
|
|
expect(point.y).toEqual(50 + (sqrt2 * 10) / 2);
|
|
});
|
|
|
|
it('getControlPoint 135', () => {
|
|
const start = { x: 100, y: 100 };
|
|
const end = { x: 0, y: 0 };
|
|
const point = getControlPoint(start, end, 0.5, 10);
|
|
const sqrt2 = Math.sqrt(2);
|
|
expect(point.x).toEqual(50 + (sqrt2 * 10) / 2);
|
|
expect(point.y).toEqual(50 - (sqrt2 * 10) / 2);
|
|
});
|
|
|
|
it('getControlPoint percent is 0', () => {
|
|
const start = { x: 100, y: 100 };
|
|
const end = { x: 50, y: 20 };
|
|
const point = getControlPoint(start, end);
|
|
expect(point.x).toEqual(100);
|
|
expect(point.y).toEqual(100);
|
|
});
|
|
|
|
it('pointsToPolygon points.length = 0', () => {
|
|
const polygonPoint = pointsToPolygon([]);
|
|
expect(polygonPoint).toEqual('');
|
|
});
|
|
|
|
it('pointsToPolygon z = false', () => {
|
|
const points = [
|
|
{
|
|
x: 1,
|
|
y: 2,
|
|
},
|
|
{
|
|
x: 5,
|
|
y: 5,
|
|
},
|
|
];
|
|
|
|
const polygonPoint = pointsToPolygon(points, false);
|
|
expect(polygonPoint).toEqual('M1 2L5 5');
|
|
});
|
|
|
|
it('pointsToPolygon z = true', () => {
|
|
const points = [
|
|
{
|
|
x: 1,
|
|
y: 2,
|
|
},
|
|
{
|
|
x: 5,
|
|
y: 5,
|
|
},
|
|
];
|
|
|
|
const polygonPoint = pointsToPolygon(points, true);
|
|
expect(polygonPoint).toEqual('M1 2L5 5Z');
|
|
});
|
|
|
|
it('pointsToPolygon substitute', () => {
|
|
const points = [
|
|
{
|
|
x: 1,
|
|
y: 2,
|
|
},
|
|
'',
|
|
];
|
|
|
|
const polygonPoint = pointsToPolygon(points, true);
|
|
expect(polygonPoint).toEqual('M1 2L{x} {y}Z');
|
|
});
|
|
|
|
it('pathToPoints', () => {
|
|
const path = [['M', 0, 0], ['L', 10, 10], ['L', 100, 40]];
|
|
const points = pathToPoints(path);
|
|
expect(points[0][0]).toBe(0);
|
|
expect(points[1][0]).toBe(10);
|
|
expect(points[2][0]).toBe(100);
|
|
});
|
|
|
|
it('getClosedSpline', () => {
|
|
const points = [{ x: 0, y: 0 }, { x: 10, y: 10 }, { x: 100, y: 40 }];
|
|
const res = getClosedSpline(points);
|
|
expect(res[0][0]).toBe('M');
|
|
expect(res[0][1]).toBe(100);
|
|
expect(res[0][2]).toBe(40);
|
|
expect(res[1][0]).toBe('C');
|
|
expect(res[1][3]).toBe(15);
|
|
expect(res[1][4]).toBe(5);
|
|
expect(res[2][0]).toBe('C');
|
|
expect(res[2][1]).toBe(-15);
|
|
expect(res[2][2]).toBe(-5);
|
|
expect(res[4][0]).toBe('C');
|
|
expect(res[4][3]).toBe(15);
|
|
expect(res[4][4]).toBe(5);
|
|
});
|
|
|
|
it('roundedHull', () => {
|
|
const points = [[0, 0], [10, 10], [100, 40]];
|
|
const res = roundedHull(points, 10);
|
|
const splits = res.split(' ');
|
|
expect(splits[0]).toEqual('M');
|
|
expect(splits[1]).toEqual('96.83772233983161,49.48683298050514');
|
|
expect(splits[2]).toEqual('A');
|
|
expect(splits[3]).toEqual('10,10,0,0,0,103.71390676354103,30.715233091147407');
|
|
});
|
|
|
|
it('paddedHull', () => {
|
|
const points = [[0, 0], [10, 10], [100, 40]];
|
|
const res: any = paddedHull(points, 10);
|
|
expect(res[0].x).toEqual(-8.348410922382678);
|
|
expect(res[0].y).toEqual(-5.504910087462066);
|
|
expect(res[1].x).toEqual(4.742688878808661);
|
|
expect(res[1].y).toEqual(18.506508083520398);
|
|
expect(res[2].x).toEqual(109.38985166381534);
|
|
expect(res[2].y).toEqual(43.439576388386264);
|
|
});
|
|
});
|