frame.akima
Version:
A package for Akima interpolation
199 lines (198 loc) • 7.22 kB
JavaScript
export function createNidekFromRadii(radii) {
let radiiString = '500100002039';
let previousRadius = radii[0];
let hexRadius = previousRadius.toString(16).toUpperCase().padStart(4, '0');
radiiString += hexRadius;
for (let i = 1; i < radii.length; i += 1) {
let radiusDifference = radii[i] - previousRadius;
if (radiusDifference < 0) {
radiusDifference += 256;
}
hexRadius = radiusDifference.toString(16).toUpperCase().padStart(2, '0');
radiiString += hexRadius;
previousRadius = radii[i];
}
return radiiString;
}
// export const appendix = definedAppendix + undefinedAppendix;
export class Nidek {
nidekString;
radii;
static createStringFromRadii(radii, print = false) {
let radiiString = '500100002039';
let previousRadius = radii[0];
let hexRadius = previousRadius.toString(16).toUpperCase().padStart(4, '0');
radiiString += hexRadius;
for (let i = 1; i < radii.length; i += 1) {
const radiusDifference = radii[i] - previousRadius;
let posRadiusDifference = radiusDifference;
if (Math.abs(radiusDifference) > 128) {
throw new Error(`Radius difference too large at index ${i}: ${radiusDifference}`);
}
if (radiusDifference < 0) {
posRadiusDifference += 256;
}
hexRadius = posRadiusDifference
.toString(16)
.toUpperCase()
.padStart(2, '0');
if (print) {
console.log(`radius[${i}] - previousRadius: ${radii[i]} - ${previousRadius} = ${radiusDifference} (${hexRadius})`);
}
radiiString += hexRadius;
previousRadius = radii[i];
}
if (print) {
console.log(`radiiString: ${radiiString}`);
}
return radiiString;
}
static getAmountOfDeviation() {
return '5DC0';
}
static getDefinedAppendix() {
let radiiString = '';
// amount of deviation
radiiString += Nidek.getAmountOfDeviation();
// Circumferential length
radiiString += '0000';
// Lens material
radiiString += '00';
// Frame material
radiiString += '46';
// Layout mode
radiiString += 'F2';
// Edge mode
radiiString += '46';
// FPD
radiiString += 'F200';
// PD right
radiiString += '0813';
// UP right
radiiString += '2039';
// Inset right
radiiString += '0000';
// DBL
radiiString += '0000';
// PD left
radiiString += '0000';
// UP left
radiiString += '05DC';
// Inset left
radiiString += '0000';
// Size
radiiString += '0000';
// // Axis differential right
// radiiString += '00';
// // Axis differential left
// radiiString += '00';
// // Difference between blocking center and optical center right
// radiiString += '0008';
// // Difference between blocking center and optical center left
// radiiString += '1320';
// // Difference between blocked center and optical center right
// radiiString += '3900';
// // Difference between blocked center and optical center left
// radiiString += '0000';
// // Full-eye or half-eye
// radiiString += '00';
// // Axis Setting right
// radiiString += '00';
// // Axis Setting left
// radiiString += '00';
// // Blocking flag
// radiiString += '05';
// // Polish Process Speed
// radiiString += 'DC';
// // Polish rotation
// radiiString += '00';
// // Flat polishing wheel Horizontal position
// radiiString += '0000';
// // Flat polishing wheel Vertical position
// radiiString += '0000';
// // S.B. polishing wheel Vertical position
// radiiString += '0000';
// // S.B. polishing wheel Horizontal position
// radiiString += '0000';
// // Lens type
// radiiString += '00';
// // PROG EP value
// radiiString += '00';
// // Bevel mode right
// radiiString += '00';
// // Bevel fine adjustment right
// radiiString += '0000';
// // Bevel mode left
// radiiString += '00';
// // Safety bevel Width
// radiiString += '00';
// // Bevel fine adjustment left
// radiiString += '00';
// // Bevel fine adjustment left
// radiiString += '00';
return radiiString;
}
static createRadiiFromString(coords) {
const radii = coords.map((coord) => Math.round(Math.sqrt(coord.x ** 2 + coord.y ** 2) * 100));
return radii;
}
static createRadiiFromCoords(coords, print = false) {
const radii = coords.map((coord, index) => {
const rad = Math.round(Math.sqrt(coord.x ** 2 + coord.y ** 2) * 100);
if (print) {
console.log(`${rad}, `);
}
return rad;
});
return radii;
}
static createStringFromCoords(coords, print = false) {
const radii = Nidek.createRadiiFromCoords(coords, print);
const radiusString = Nidek.createStringFromRadii(radii, print);
return radiusString + Nidek.getDefinedAppendix(); // + undefinedAppendix;
}
constructor(nidekString) {
this.nidekString = nidekString;
let firstRadius = 0;
let position = 12;
this.radii = [];
const firstRadiusHex = nidekString.substring(position, position + 4);
firstRadius = parseInt(firstRadiusHex, 16);
this.radii.push(firstRadius);
let lastRadius = firstRadius;
position += 4;
let radiusLoop;
for (radiusLoop = 0; radiusLoop < 999; radiusLoop += 1) {
const nidekPart = nidekString.substring(position, position + 2);
let incrementRadius = parseInt(nidekPart, 16);
if (incrementRadius > 127) {
incrementRadius -= 256;
}
lastRadius += incrementRadius;
this.radii.push(lastRadius);
position += 2;
}
}
get Radii() {
return this.radii;
}
get Coords() {
return this.radii.map((radius, index) => {
const angle = (index * 360) / this.radii.length;
const x = radius * Math.cos((angle * Math.PI) / 180);
const y = radius * Math.sin((angle * Math.PI) / 180);
return { x: Math.round(x) / 100, y: Math.round(y) / 100 };
});
}
}
export const definedAppendix = Nidek.getAmountOfDeviation() +
'00000046F246F200' +
'0813' +
'2039' +
'0000' +
'0000' +
'0000' +
'05DC' +
'0000' +
'0000';
export const undefinedAppendix = '000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000';