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 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 이상(로컬 개발·테스트)
@@ -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
- this.ax = ax;
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.normalizeAngle360(TABOToDeg(axisDeg));
9185
- const orthogonalTabo = this.normalizeAngle360(taboAxis + 90);
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 },
@@ -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
- this.ax = ax;
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.normalizeAngle360(TABOToDeg(axisDeg));
9183
- const orthogonalTabo = this.normalizeAngle360(taboAxis + 90);
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 },
@@ -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
- this.ax = ax;
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.normalizeAngle360(TABOToDeg(axisDeg));
9189
- const orthogonalTabo = this.normalizeAngle360(taboAxis + 90);
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;
@@ -17,6 +17,7 @@ export type STSurfaceProps = {
17
17
  r?: number;
18
18
  s: number;
19
19
  c: number;
20
+ /** 실린더 축, TABO(°). 내부 저장은 TABOToDeg 변환 후 각도이다. */
20
21
  ax: number;
21
22
  n_before: RefractiveIndexSpec;
22
23
  n: RefractiveIndexSpec;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "scax-engine",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Optical calculation engine for an eye model, with ESM, CJS, and UMD builds.",
5
5
  "main": "./dist/scax-engine.cjs",
6
6
  "module": "./dist/scax-engine.js",