scax-engine 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -0
- package/dist/scax-engine.cjs +18 -10
- package/dist/scax-engine.js +18 -10
- package/dist/scax-engine.umd.js +18 -10
- package/dist/types/scax-engine.d.ts +2 -0
- package/dist/types/surfaces/st-surface.d.ts +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -2,8 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
눈 모델(Gullstrand / Navarro)에 대한 광선 추적, Sturm 간격 분석, 아핀 왜곡 추정, 유발 난시·프리즘 편위 계산을 제공하는 TypeScript 안경광학 시뮬레이션(단안 기준, OD) 라이브러리입니다. ESM, CJS, UMD 빌드를 지원합니다.
|
|
4
4
|
|
|
5
|
+
|
|
5
6
|
English documentation: [README-en.md](README-en.md)
|
|
6
7
|
|
|
8
|
+
## SCAX란?
|
|
9
|
+
|
|
10
|
+
scax는 안경광학에서 기본적으로 쓰이는 데이터입니다. **S**는 구면렌즈 도수, **C**는 원주렌즈 도수, **AX**는 원주렌즈의 축입니다.
|
|
11
|
+
|
|
12
|
+
|
|
7
13
|
## 요구 사항
|
|
8
14
|
|
|
9
15
|
- **Node.js** 20 이상(로컬 개발·테스트)
|
package/dist/scax-engine.cjs
CHANGED
|
@@ -8339,6 +8339,13 @@ class ApertureStopSurface extends Surface {
|
|
|
8339
8339
|
}
|
|
8340
8340
|
}
|
|
8341
8341
|
|
|
8342
|
+
const DegToTABO = (degree) => {
|
|
8343
|
+
const d = Number(degree);
|
|
8344
|
+
if (!Number.isFinite(d))
|
|
8345
|
+
return 0;
|
|
8346
|
+
return (((180 - d) % 180) + 180) % 180;
|
|
8347
|
+
};
|
|
8348
|
+
|
|
8342
8349
|
class ToricSurface extends Surface {
|
|
8343
8350
|
constructor(props) {
|
|
8344
8351
|
super({ type: "toric", name: props.name, position: props.position, tilt: props.tilt });
|
|
@@ -8554,7 +8561,8 @@ class STSurface extends Surface {
|
|
|
8554
8561
|
const { s, c, ax, n_before = 1.0, n = 1.0, n_after = n_before, referencePoint, thickness = ST_DEFAULT_THICKNESS_MM, } = props;
|
|
8555
8562
|
this.s = s;
|
|
8556
8563
|
this.c = c;
|
|
8557
|
-
|
|
8564
|
+
// paraxial-surface와 동일: 처방 축은 TABO(°), 굴절/기하에는 수학 좌표 각(0~180)로 변환해 저장한다.
|
|
8565
|
+
this.ax = DegToTABO(ax);
|
|
8558
8566
|
this.n_before = normalizeRefractiveIndexSpec(n_before);
|
|
8559
8567
|
this.n = normalizeRefractiveIndexSpec(n);
|
|
8560
8568
|
this.n_after = normalizeRefractiveIndexSpec(n_after);
|
|
@@ -8803,13 +8811,6 @@ const TABOToDeg = (TABOAngle) => {
|
|
|
8803
8811
|
return (((180 - t) % 180) + 180) % 180;
|
|
8804
8812
|
};
|
|
8805
8813
|
|
|
8806
|
-
const DegToTABO = (degree) => {
|
|
8807
|
-
const d = Number(degree);
|
|
8808
|
-
if (!Number.isFinite(d))
|
|
8809
|
-
return 0;
|
|
8810
|
-
return (((180 - d) % 180) + 180) % 180;
|
|
8811
|
-
};
|
|
8812
|
-
|
|
8813
8814
|
/**
|
|
8814
8815
|
* legacy simulator.js를 TypeScript로 옮긴 핵심 시뮬레이터입니다.
|
|
8815
8816
|
* - 광원 광선을 생성하고
|
|
@@ -9177,12 +9178,19 @@ class SCAXEngineCore {
|
|
|
9177
9178
|
}
|
|
9178
9179
|
return { m, j0, j45 };
|
|
9179
9180
|
}
|
|
9181
|
+
/** 난시 주경선 TABO 각도: 180° 동치이므로 표시·비교는 항상 [0, 180)으로 맞춘다. */
|
|
9182
|
+
normalizeTaboMeridian180(value) {
|
|
9183
|
+
const d = Number(value ?? 0);
|
|
9184
|
+
if (!Number.isFinite(d))
|
|
9185
|
+
return 0;
|
|
9186
|
+
return ((d % 180) + 180) % 180;
|
|
9187
|
+
}
|
|
9180
9188
|
principalMeridiansFromVector(m, j0, j45) {
|
|
9181
9189
|
if (!Number.isFinite(m) || !Number.isFinite(j0) || !Number.isFinite(j45))
|
|
9182
9190
|
return [];
|
|
9183
9191
|
const axisDeg = (((0.5 * Math.atan2(j45, j0) * 180) / Math.PI) % 180 + 180) % 180;
|
|
9184
|
-
const taboAxis = this.
|
|
9185
|
-
const orthogonalTabo =
|
|
9192
|
+
const taboAxis = this.normalizeTaboMeridian180(TABOToDeg(axisDeg));
|
|
9193
|
+
const orthogonalTabo = (taboAxis + 90) % 180;
|
|
9186
9194
|
const r = Math.hypot(j0, j45);
|
|
9187
9195
|
const meridians = [
|
|
9188
9196
|
{ tabo: taboAxis, d: m - r },
|
package/dist/scax-engine.js
CHANGED
|
@@ -8337,6 +8337,13 @@ class ApertureStopSurface extends Surface {
|
|
|
8337
8337
|
}
|
|
8338
8338
|
}
|
|
8339
8339
|
|
|
8340
|
+
const DegToTABO = (degree) => {
|
|
8341
|
+
const d = Number(degree);
|
|
8342
|
+
if (!Number.isFinite(d))
|
|
8343
|
+
return 0;
|
|
8344
|
+
return (((180 - d) % 180) + 180) % 180;
|
|
8345
|
+
};
|
|
8346
|
+
|
|
8340
8347
|
class ToricSurface extends Surface {
|
|
8341
8348
|
constructor(props) {
|
|
8342
8349
|
super({ type: "toric", name: props.name, position: props.position, tilt: props.tilt });
|
|
@@ -8552,7 +8559,8 @@ class STSurface extends Surface {
|
|
|
8552
8559
|
const { s, c, ax, n_before = 1.0, n = 1.0, n_after = n_before, referencePoint, thickness = ST_DEFAULT_THICKNESS_MM, } = props;
|
|
8553
8560
|
this.s = s;
|
|
8554
8561
|
this.c = c;
|
|
8555
|
-
|
|
8562
|
+
// paraxial-surface와 동일: 처방 축은 TABO(°), 굴절/기하에는 수학 좌표 각(0~180)로 변환해 저장한다.
|
|
8563
|
+
this.ax = DegToTABO(ax);
|
|
8556
8564
|
this.n_before = normalizeRefractiveIndexSpec(n_before);
|
|
8557
8565
|
this.n = normalizeRefractiveIndexSpec(n);
|
|
8558
8566
|
this.n_after = normalizeRefractiveIndexSpec(n_after);
|
|
@@ -8801,13 +8809,6 @@ const TABOToDeg = (TABOAngle) => {
|
|
|
8801
8809
|
return (((180 - t) % 180) + 180) % 180;
|
|
8802
8810
|
};
|
|
8803
8811
|
|
|
8804
|
-
const DegToTABO = (degree) => {
|
|
8805
|
-
const d = Number(degree);
|
|
8806
|
-
if (!Number.isFinite(d))
|
|
8807
|
-
return 0;
|
|
8808
|
-
return (((180 - d) % 180) + 180) % 180;
|
|
8809
|
-
};
|
|
8810
|
-
|
|
8811
8812
|
/**
|
|
8812
8813
|
* legacy simulator.js를 TypeScript로 옮긴 핵심 시뮬레이터입니다.
|
|
8813
8814
|
* - 광원 광선을 생성하고
|
|
@@ -9175,12 +9176,19 @@ class SCAXEngineCore {
|
|
|
9175
9176
|
}
|
|
9176
9177
|
return { m, j0, j45 };
|
|
9177
9178
|
}
|
|
9179
|
+
/** 난시 주경선 TABO 각도: 180° 동치이므로 표시·비교는 항상 [0, 180)으로 맞춘다. */
|
|
9180
|
+
normalizeTaboMeridian180(value) {
|
|
9181
|
+
const d = Number(value ?? 0);
|
|
9182
|
+
if (!Number.isFinite(d))
|
|
9183
|
+
return 0;
|
|
9184
|
+
return ((d % 180) + 180) % 180;
|
|
9185
|
+
}
|
|
9178
9186
|
principalMeridiansFromVector(m, j0, j45) {
|
|
9179
9187
|
if (!Number.isFinite(m) || !Number.isFinite(j0) || !Number.isFinite(j45))
|
|
9180
9188
|
return [];
|
|
9181
9189
|
const axisDeg = (((0.5 * Math.atan2(j45, j0) * 180) / Math.PI) % 180 + 180) % 180;
|
|
9182
|
-
const taboAxis = this.
|
|
9183
|
-
const orthogonalTabo =
|
|
9190
|
+
const taboAxis = this.normalizeTaboMeridian180(TABOToDeg(axisDeg));
|
|
9191
|
+
const orthogonalTabo = (taboAxis + 90) % 180;
|
|
9184
9192
|
const r = Math.hypot(j0, j45);
|
|
9185
9193
|
const meridians = [
|
|
9186
9194
|
{ tabo: taboAxis, d: m - r },
|
package/dist/scax-engine.umd.js
CHANGED
|
@@ -8343,6 +8343,13 @@
|
|
|
8343
8343
|
}
|
|
8344
8344
|
}
|
|
8345
8345
|
|
|
8346
|
+
const DegToTABO = (degree) => {
|
|
8347
|
+
const d = Number(degree);
|
|
8348
|
+
if (!Number.isFinite(d))
|
|
8349
|
+
return 0;
|
|
8350
|
+
return (((180 - d) % 180) + 180) % 180;
|
|
8351
|
+
};
|
|
8352
|
+
|
|
8346
8353
|
class ToricSurface extends Surface {
|
|
8347
8354
|
constructor(props) {
|
|
8348
8355
|
super({ type: "toric", name: props.name, position: props.position, tilt: props.tilt });
|
|
@@ -8558,7 +8565,8 @@
|
|
|
8558
8565
|
const { s, c, ax, n_before = 1.0, n = 1.0, n_after = n_before, referencePoint, thickness = ST_DEFAULT_THICKNESS_MM, } = props;
|
|
8559
8566
|
this.s = s;
|
|
8560
8567
|
this.c = c;
|
|
8561
|
-
|
|
8568
|
+
// paraxial-surface와 동일: 처방 축은 TABO(°), 굴절/기하에는 수학 좌표 각(0~180)로 변환해 저장한다.
|
|
8569
|
+
this.ax = DegToTABO(ax);
|
|
8562
8570
|
this.n_before = normalizeRefractiveIndexSpec(n_before);
|
|
8563
8571
|
this.n = normalizeRefractiveIndexSpec(n);
|
|
8564
8572
|
this.n_after = normalizeRefractiveIndexSpec(n_after);
|
|
@@ -8807,13 +8815,6 @@
|
|
|
8807
8815
|
return (((180 - t) % 180) + 180) % 180;
|
|
8808
8816
|
};
|
|
8809
8817
|
|
|
8810
|
-
const DegToTABO = (degree) => {
|
|
8811
|
-
const d = Number(degree);
|
|
8812
|
-
if (!Number.isFinite(d))
|
|
8813
|
-
return 0;
|
|
8814
|
-
return (((180 - d) % 180) + 180) % 180;
|
|
8815
|
-
};
|
|
8816
|
-
|
|
8817
8818
|
/**
|
|
8818
8819
|
* legacy simulator.js를 TypeScript로 옮긴 핵심 시뮬레이터입니다.
|
|
8819
8820
|
* - 광원 광선을 생성하고
|
|
@@ -9181,12 +9182,19 @@
|
|
|
9181
9182
|
}
|
|
9182
9183
|
return { m, j0, j45 };
|
|
9183
9184
|
}
|
|
9185
|
+
/** 난시 주경선 TABO 각도: 180° 동치이므로 표시·비교는 항상 [0, 180)으로 맞춘다. */
|
|
9186
|
+
normalizeTaboMeridian180(value) {
|
|
9187
|
+
const d = Number(value ?? 0);
|
|
9188
|
+
if (!Number.isFinite(d))
|
|
9189
|
+
return 0;
|
|
9190
|
+
return ((d % 180) + 180) % 180;
|
|
9191
|
+
}
|
|
9184
9192
|
principalMeridiansFromVector(m, j0, j45) {
|
|
9185
9193
|
if (!Number.isFinite(m) || !Number.isFinite(j0) || !Number.isFinite(j45))
|
|
9186
9194
|
return [];
|
|
9187
9195
|
const axisDeg = (((0.5 * Math.atan2(j45, j0) * 180) / Math.PI) % 180 + 180) % 180;
|
|
9188
|
-
const taboAxis = this.
|
|
9189
|
-
const orthogonalTabo =
|
|
9196
|
+
const taboAxis = this.normalizeTaboMeridian180(TABOToDeg(axisDeg));
|
|
9197
|
+
const orthogonalTabo = (taboAxis + 90) % 180;
|
|
9190
9198
|
const r = Math.hypot(j0, j45);
|
|
9191
9199
|
const meridians = [
|
|
9192
9200
|
{ tabo: taboAxis, d: m - r },
|
|
@@ -294,6 +294,8 @@ export declare class SCAXEngineCore {
|
|
|
294
294
|
private isRayInsidePupil;
|
|
295
295
|
private powerVectorFromCylinder;
|
|
296
296
|
private aggregatePowerVector;
|
|
297
|
+
/** 난시 주경선 TABO 각도: 180° 동치이므로 표시·비교는 항상 [0, 180)으로 맞춘다. */
|
|
298
|
+
private normalizeTaboMeridian180;
|
|
297
299
|
private principalMeridiansFromVector;
|
|
298
300
|
private principalMeridiansFromPowers;
|
|
299
301
|
private normalizePrismAmount;
|
package/package.json
CHANGED