frame.akima
Version:
A package for Akima interpolation
66 lines (65 loc) • 3.07 kB
JavaScript
// import { test, expect, describe } from 'vitest';
import { Point } from './Point';
import { createAkimaRadii } from './Akima';
import { Nidek } from './nidek/Nidek';
describe('Akima', () => {
test('create an Akima', () => {
const universeCenter = new Point(0, 0);
const offset = 200;
const points = [
new Point(0, offset, universeCenter),
new Point(0, -offset, universeCenter),
new Point(offset, 0, universeCenter),
new Point(-offset, 0, universeCenter),
];
const expectedPoints = [
new Point(200, 0, universeCenter),
new Point(184.776, 76.537, universeCenter),
new Point(141.421, 141.421, universeCenter),
new Point(76.537, 184.776, universeCenter),
new Point(0, 200, universeCenter),
new Point(-76.537, 184.776, universeCenter),
new Point(-141.421, 141.421, universeCenter),
new Point(-184.776, 76.537, universeCenter),
new Point(-200, 0, universeCenter),
new Point(-184.776, -76.537, universeCenter),
new Point(-141.421, -141.421, universeCenter),
new Point(-76.537, -184.776, universeCenter),
new Point(0, -200, universeCenter),
new Point(76.537, -184.776, universeCenter),
new Point(141.421, -141.421, universeCenter),
new Point(184.776, -76.537, universeCenter),
];
createAkimaRadii(points.map((point) => ({ x: point.X, y: point.Y })), { x: universeCenter.X, y: universeCenter.Y }, 16).forEach((point, index) => {
// console.log(`new Point(${point.X}, ${point.Y}, universeCenter),`);
// console.log(`expect(point.X).toEqual(${point.X});`);
expect(point.x).toBeCloseTo(expectedPoints[index].X, 3);
expect(point.y).toBeCloseTo(expectedPoints[index].Y, 3);
// expect(point.Y).toBeCloseTo(0, 1);
});
});
test('create an Akima 2', () => {
const universeCenter = new Point(0, 0);
const points = [
new Point(200, 0, universeCenter),
new Point(0, 200, universeCenter),
new Point(-200, 0, universeCenter),
new Point(0, -200, universeCenter),
new Point(102.515625, 100.203125, universeCenter),
];
const scaleFactor = 10;
const akimaKoords = createAkimaRadii(points.map((point) => ({
x: point.X / scaleFactor,
y: point.Y / scaleFactor,
})), { x: universeCenter.X, y: universeCenter.Y }, 1000);
console.log(`universeCenter: [${universeCenter.X}, ${universeCenter.Y}]`);
try {
const nid = Nidek.createStringFromCoords(akimaKoords);
throw new Error('This code path should not be reached because the function Nidek.createStringFromCoords(..) should throw an error');
}
catch (e) {
expect(e).toBeInstanceOf(Error);
console.error(`Error creating Nidek string: ${e}`);
}
});
});