@photivra/engine 1.4.0 → 2.0.0
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/CHANGELOG.md +401 -6
- package/CITATION.cff +1 -1
- package/NODE_SUPPORT.md +64 -12
- package/README.md +301 -182
- package/SECURITY.md +37 -28
- package/THIRD_PARTY.md +148 -4
- package/dist/camera/equivalent-focal-length.d.ts +13 -14
- package/dist/camera/equivalent-focal-length.js +15 -13
- package/dist/camera/equivalent-focal-length.js.map +1 -1
- package/dist/camera/field-of-view.d.ts +30 -19
- package/dist/camera/field-of-view.js +67 -18
- package/dist/camera/field-of-view.js.map +1 -1
- package/dist/camera/lens-projection.d.ts +170 -0
- package/dist/camera/lens-projection.js +444 -0
- package/dist/camera/lens-projection.js.map +1 -0
- package/dist/camera/projected-object-size.d.ts +10 -11
- package/dist/camera/projected-object-size.js +12 -10
- package/dist/camera/projected-object-size.js.map +1 -1
- package/dist/capture/capture-export-metadata.d.ts +9 -10
- package/dist/capture/capture-export-metadata.js +8 -5
- package/dist/capture/capture-export-metadata.js.map +1 -1
- package/dist/capture/dng-import.d.ts +91 -0
- package/dist/capture/dng-import.js +343 -0
- package/dist/capture/dng-import.js.map +1 -0
- package/dist/capture/environment-raw-producer.d.ts +37 -17
- package/dist/capture/environment-raw-producer.js +43 -19
- package/dist/capture/environment-raw-producer.js.map +1 -1
- package/dist/capture/export-jpeg.d.ts +35 -4
- package/dist/capture/export-jpeg.js +133 -47
- package/dist/capture/export-jpeg.js.map +1 -1
- package/dist/capture/export-tiff.d.ts +48 -24
- package/dist/capture/export-tiff.js +91 -31
- package/dist/capture/export-tiff.js.map +1 -1
- package/dist/capture/focus-control.d.ts +42 -65
- package/dist/capture/focus-control.js +56 -75
- package/dist/capture/focus-control.js.map +1 -1
- package/dist/capture/host-yield-cadence.d.ts +25 -0
- package/dist/capture/host-yield-cadence.js +25 -0
- package/dist/capture/host-yield-cadence.js.map +1 -0
- package/dist/capture/linear-encoding.d.ts +14 -12
- package/dist/capture/linear-encoding.js +14 -13
- package/dist/capture/linear-encoding.js.map +1 -1
- package/dist/capture/lossless-jpeg.d.ts +27 -0
- package/dist/capture/lossless-jpeg.js +237 -0
- package/dist/capture/lossless-jpeg.js.map +1 -0
- package/dist/capture/native-environment-lean.d.ts +227 -0
- package/dist/capture/native-environment-lean.js +974 -0
- package/dist/capture/native-environment-lean.js.map +1 -0
- package/dist/capture/native-environment-optical-stage.d.ts +97 -0
- package/dist/capture/native-environment-optical-stage.js +340 -0
- package/dist/capture/native-environment-optical-stage.js.map +1 -0
- package/dist/capture/native-environment-raw.d.ts +140 -6
- package/dist/capture/native-environment-raw.js +435 -34
- package/dist/capture/native-environment-raw.js.map +1 -1
- package/dist/capture/native-raw-development.d.ts +118 -5
- package/dist/capture/native-raw-development.js +224 -59
- package/dist/capture/native-raw-development.js.map +1 -1
- package/dist/capture/native-raw-dng.d.ts +60 -0
- package/dist/capture/native-raw-dng.js +167 -0
- package/dist/capture/native-raw-dng.js.map +1 -0
- package/dist/capture/native-raw.d.ts +67 -10
- package/dist/capture/native-raw.js +90 -24
- package/dist/capture/native-raw.js.map +1 -1
- package/dist/capture/packed-sensor-raw.d.ts +160 -0
- package/dist/capture/packed-sensor-raw.js +221 -0
- package/dist/capture/packed-sensor-raw.js.map +1 -0
- package/dist/capture/photographic-export.d.ts +58 -35
- package/dist/capture/photographic-export.js +177 -70
- package/dist/capture/photographic-export.js.map +1 -1
- package/dist/capture/raw-development-kernel.d.ts +52 -0
- package/dist/capture/raw-development-kernel.js +88 -0
- package/dist/capture/raw-development-kernel.js.map +1 -0
- package/dist/capture/raw-frame-limits.d.ts +7 -7
- package/dist/capture/raw-frame-limits.js +7 -6
- package/dist/capture/raw-frame-limits.js.map +1 -1
- package/dist/capture/raw-frame-reconstruction.d.ts +8 -9
- package/dist/capture/raw-frame-reconstruction.js +9 -8
- package/dist/capture/raw-frame-reconstruction.js.map +1 -1
- package/dist/capture/raw-white-level.d.ts +55 -0
- package/dist/capture/raw-white-level.js +165 -0
- package/dist/capture/raw-white-level.js.map +1 -0
- package/dist/capture/release-sequence.d.ts +5 -7
- package/dist/capture/release-sequence.js +15 -13
- package/dist/capture/release-sequence.js.map +1 -1
- package/dist/capture/sensor-raw-frame.d.ts +5 -6
- package/dist/capture/sensor-raw-frame.js +26 -9
- package/dist/capture/sensor-raw-frame.js.map +1 -1
- package/dist/capture/sensor-raw-producer.d.ts +21 -13
- package/dist/capture/sensor-raw-producer.js +86 -25
- package/dist/capture/sensor-raw-producer.js.map +1 -1
- package/dist/capture/simulated-capture.d.ts +15 -16
- package/dist/capture/simulated-capture.js +22 -12
- package/dist/capture/simulated-capture.js.map +1 -1
- package/dist/color/camera-color-matrix.d.ts +69 -0
- package/dist/color/camera-color-matrix.js +132 -0
- package/dist/color/camera-color-matrix.js.map +1 -0
- package/dist/color/capture-color.d.ts +17 -10
- package/dist/color/capture-color.js +50 -17
- package/dist/color/capture-color.js.map +1 -1
- package/dist/color/chromatic-adaptation.d.ts +63 -0
- package/dist/color/chromatic-adaptation.js +91 -0
- package/dist/color/chromatic-adaptation.js.map +1 -0
- package/dist/color/color-difference.d.ts +104 -0
- package/dist/color/color-difference.js +205 -0
- package/dist/color/color-difference.js.map +1 -0
- package/dist/color/color-matching-functions.d.ts +168 -0
- package/dist/color/color-matching-functions.js +309 -0
- package/dist/color/color-matching-functions.js.map +1 -0
- package/dist/color/colorimetry-math.d.ts +52 -0
- package/dist/color/colorimetry-math.js +144 -0
- package/dist/color/colorimetry-math.js.map +1 -0
- package/dist/color/gamut-mapping.d.ts +54 -0
- package/dist/color/gamut-mapping.js +107 -0
- package/dist/color/gamut-mapping.js.map +1 -0
- package/dist/color/illuminants.d.ts +182 -0
- package/dist/color/illuminants.js +434 -0
- package/dist/color/illuminants.js.map +1 -0
- package/dist/color/rgb-color-spaces.d.ts +79 -0
- package/dist/color/rgb-color-spaces.js +115 -0
- package/dist/color/rgb-color-spaces.js.map +1 -0
- package/dist/color/sensor-color-development.d.ts +33 -11
- package/dist/color/sensor-color-development.js +104 -30
- package/dist/color/sensor-color-development.js.map +1 -1
- package/dist/color/srgb-icc.d.ts +9 -2
- package/dist/color/srgb-icc.js +16 -5
- package/dist/color/srgb-icc.js.map +1 -1
- package/dist/color/srgb-transfer.d.ts +1 -2
- package/dist/color/srgb-transfer.js +1 -1
- package/dist/color/srgb-transfer.js.map +1 -1
- package/dist/color/white-balance.d.ts +68 -19
- package/dist/color/white-balance.js +168 -35
- package/dist/color/white-balance.js.map +1 -1
- package/dist/composition/image-formation-plan.d.ts +152 -128
- package/dist/composition/image-formation-plan.js +292 -138
- package/dist/composition/image-formation-plan.js.map +1 -1
- package/dist/composition/plan-consumer.d.ts +6 -7
- package/dist/composition/plan-consumer.js +14 -11
- package/dist/composition/plan-consumer.js.map +1 -1
- package/dist/core/calculation-result.d.ts +21 -14
- package/dist/core/calculation-result.js +209 -11
- package/dist/core/calculation-result.js.map +1 -1
- package/dist/core/canonical-json.d.ts +13 -8
- package/dist/core/canonical-json.js +34 -15
- package/dist/core/canonical-json.js.map +1 -1
- package/dist/core/configuration-error.d.ts +5 -4
- package/dist/core/configuration-error.js +5 -3
- package/dist/core/configuration-error.js.map +1 -1
- package/dist/core/evidence-provenance.d.ts +12 -12
- package/dist/core/evidence-provenance.js +10 -9
- package/dist/core/evidence-provenance.js.map +1 -1
- package/dist/core/image-formation.d.ts +11 -10
- package/dist/core/image-formation.js +11 -9
- package/dist/core/image-formation.js.map +1 -1
- package/dist/core/owned-data.d.ts +9 -17
- package/dist/core/owned-data.js +9 -16
- package/dist/core/owned-data.js.map +1 -1
- package/dist/core/portable-math.d.ts +15 -0
- package/dist/core/portable-math.js +56 -0
- package/dist/core/portable-math.js.map +1 -0
- package/dist/core/record-validation.d.ts +48 -9
- package/dist/core/record-validation.js +93 -19
- package/dist/core/record-validation.js.map +1 -1
- package/dist/core/scientific-assurance.d.ts +16 -14
- package/dist/core/scientific-assurance.js +22 -18
- package/dist/core/scientific-assurance.js.map +1 -1
- package/dist/core/spectral-composition.d.ts +13 -14
- package/dist/core/spectral-composition.js +30 -27
- package/dist/core/spectral-composition.js.map +1 -1
- package/dist/core/spectral.d.ts +5 -6
- package/dist/core/spectral.js +9 -7
- package/dist/core/spectral.js.map +1 -1
- package/dist/core/validation.d.ts +3 -6
- package/dist/core/validation.js +3 -5
- package/dist/core/validation.js.map +1 -1
- package/dist/core/version.d.ts +6 -6
- package/dist/core/version.js +6 -5
- package/dist/core/version.js.map +1 -1
- package/dist/equipment/exposure-capabilities.d.ts +10 -10
- package/dist/equipment/exposure-capabilities.js +40 -30
- package/dist/equipment/exposure-capabilities.js.map +1 -1
- package/dist/equipment/generic-tier-assets.d.ts +13 -6
- package/dist/equipment/generic-tier-assets.js +34 -15
- package/dist/equipment/generic-tier-assets.js.map +1 -1
- package/dist/equipment/generic-tier-presets.d.ts +5 -6
- package/dist/equipment/generic-tier-presets.js +15 -13
- package/dist/equipment/generic-tier-presets.js.map +1 -1
- package/dist/equipment/iso-capabilities.d.ts +21 -22
- package/dist/equipment/iso-capabilities.js +49 -44
- package/dist/equipment/iso-capabilities.js.map +1 -1
- package/dist/equipment/metering-capabilities.d.ts +5 -6
- package/dist/equipment/metering-capabilities.js +22 -19
- package/dist/equipment/metering-capabilities.js.map +1 -1
- package/dist/equipment/release-capabilities.d.ts +3 -4
- package/dist/equipment/release-capabilities.js +18 -14
- package/dist/equipment/release-capabilities.js.map +1 -1
- package/dist/exposure/exposure-duration-control.d.ts +19 -17
- package/dist/exposure/exposure-duration-control.js +27 -23
- package/dist/exposure/exposure-duration-control.js.map +1 -1
- package/dist/exposure/exposure-mode-resolver.d.ts +42 -39
- package/dist/exposure/exposure-mode-resolver.js +127 -82
- package/dist/exposure/exposure-mode-resolver.js.map +1 -1
- package/dist/exposure/exposure.d.ts +17 -16
- package/dist/exposure/exposure.js +22 -15
- package/dist/exposure/exposure.js.map +1 -1
- package/dist/exposure/flash-ttl.d.ts +135 -0
- package/dist/exposure/flash-ttl.js +193 -0
- package/dist/exposure/flash-ttl.js.map +1 -0
- package/dist/exposure/flash.d.ts +144 -36
- package/dist/exposure/flash.js +259 -59
- package/dist/exposure/flash.js.map +1 -1
- package/dist/exposure/metering-scene-radiance.d.ts +10 -10
- package/dist/exposure/metering-scene-radiance.js +42 -23
- package/dist/exposure/metering-scene-radiance.js.map +1 -1
- package/dist/exposure/metering-target.d.ts +8 -8
- package/dist/exposure/metering-target.js +30 -20
- package/dist/exposure/metering-target.js.map +1 -1
- package/dist/exposure/metering-temporal.d.ts +16 -15
- package/dist/exposure/metering-temporal.js +41 -19
- package/dist/exposure/metering-temporal.js.map +1 -1
- package/dist/exposure/metering.d.ts +64 -17
- package/dist/exposure/metering.js +159 -30
- package/dist/exposure/metering.js.map +1 -1
- package/dist/exposure/program-line.d.ts +5 -5
- package/dist/exposure/program-line.js +20 -13
- package/dist/exposure/program-line.js.map +1 -1
- package/dist/facade/camera-preset.d.ts +8 -0
- package/dist/facade/camera-preset.js +102 -0
- package/dist/facade/camera-preset.js.map +1 -0
- package/dist/facade/chart-radiance-batch.d.ts +57 -0
- package/dist/facade/chart-radiance-batch.js +121 -0
- package/dist/facade/chart-radiance-batch.js.map +1 -0
- package/dist/facade/chart-scenes.d.ts +177 -0
- package/dist/facade/chart-scenes.js +232 -0
- package/dist/facade/chart-scenes.js.map +1 -0
- package/dist/facade/host-yield.d.ts +7 -0
- package/dist/facade/host-yield.js +23 -0
- package/dist/facade/host-yield.js.map +1 -0
- package/dist/facade/scene-radiance.d.ts +117 -0
- package/dist/facade/scene-radiance.js +205 -0
- package/dist/facade/scene-radiance.js.map +1 -0
- package/dist/facade/simulate-capture.d.ts +284 -0
- package/dist/facade/simulate-capture.js +1026 -0
- package/dist/facade/simulate-capture.js.map +1 -0
- package/dist/gpu/chart-radiance-gpu.d.ts +17 -0
- package/dist/gpu/chart-radiance-gpu.js +176 -0
- package/dist/gpu/chart-radiance-gpu.js.map +1 -0
- package/dist/gpu/image-kernel-accelerator.d.ts +132 -0
- package/dist/gpu/image-kernel-accelerator.js +720 -0
- package/dist/gpu/image-kernel-accelerator.js.map +1 -0
- package/dist/gpu/image-kernel-execution.d.ts +92 -0
- package/dist/gpu/image-kernel-execution.js +84 -0
- package/dist/gpu/image-kernel-execution.js.map +1 -0
- package/dist/gpu/sensor-stage-gpu.d.ts +44 -0
- package/dist/gpu/sensor-stage-gpu.js +317 -0
- package/dist/gpu/sensor-stage-gpu.js.map +1 -0
- package/dist/gpu/temporal-sum-gpu.d.ts +23 -0
- package/dist/gpu/temporal-sum-gpu.js +150 -0
- package/dist/gpu/temporal-sum-gpu.js.map +1 -0
- package/dist/gpu/webgpu-runtime.d.ts +63 -0
- package/dist/gpu/webgpu-runtime.js +215 -0
- package/dist/gpu/webgpu-runtime.js.map +1 -0
- package/dist/gpu/wgsl-chart-kernel.d.ts +30 -0
- package/dist/gpu/wgsl-chart-kernel.js +165 -0
- package/dist/gpu/wgsl-chart-kernel.js.map +1 -0
- package/dist/gpu/wgsl-kernels.d.ts +53 -0
- package/dist/gpu/wgsl-kernels.js +365 -0
- package/dist/gpu/wgsl-kernels.js.map +1 -0
- package/dist/gpu/wgsl-sensor-kernel.d.ts +64 -0
- package/dist/gpu/wgsl-sensor-kernel.js +409 -0
- package/dist/gpu/wgsl-sensor-kernel.js.map +1 -0
- package/dist/index.d.ts +89 -25
- package/dist/index.js +59 -15
- package/dist/index.js.map +1 -1
- package/dist/motion/camera-rotation.d.ts +92 -40
- package/dist/motion/camera-rotation.js +84 -47
- package/dist/motion/camera-rotation.js.map +1 -1
- package/dist/motion/capture-rotation-inverse-mapping.d.ts +37 -34
- package/dist/motion/capture-rotation-inverse-mapping.js +32 -24
- package/dist/motion/capture-rotation-inverse-mapping.js.map +1 -1
- package/dist/motion/capture-rotation-temporal-quadrature.d.ts +39 -35
- package/dist/motion/capture-rotation-temporal-quadrature.js +37 -28
- package/dist/motion/capture-rotation-temporal-quadrature.js.map +1 -1
- package/dist/motion/capture-rotation-trajectory.d.ts +32 -28
- package/dist/motion/capture-rotation-trajectory.js +36 -26
- package/dist/motion/capture-rotation-trajectory.js.map +1 -1
- package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts +23 -21
- package/dist/motion/capture-translation-parallax-temporal-quadrature.js +33 -14
- package/dist/motion/capture-translation-parallax-temporal-quadrature.js.map +1 -1
- package/dist/motion/extended-object-projection.d.ts +19 -16
- package/dist/motion/extended-object-projection.js +38 -18
- package/dist/motion/extended-object-projection.js.map +1 -1
- package/dist/motion/projected-motion.d.ts +18 -17
- package/dist/motion/projected-motion.js +25 -17
- package/dist/motion/projected-motion.js.map +1 -1
- package/dist/motion/temporal-exposure-sum.d.ts +55 -0
- package/dist/motion/temporal-exposure-sum.js +141 -0
- package/dist/motion/temporal-exposure-sum.js.map +1 -0
- package/dist/motion/video-sequence.d.ts +111 -0
- package/dist/motion/video-sequence.js +179 -0
- package/dist/motion/video-sequence.js.map +1 -0
- package/dist/optics/aperture.d.ts +14 -15
- package/dist/optics/aperture.js +13 -11
- package/dist/optics/aperture.js.map +1 -1
- package/dist/optics/atmospheric-haze.d.ts +83 -0
- package/dist/optics/atmospheric-haze.js +113 -0
- package/dist/optics/atmospheric-haze.js.map +1 -0
- package/dist/optics/brown-conrady-distortion.d.ts +116 -0
- package/dist/optics/brown-conrady-distortion.js +291 -0
- package/dist/optics/brown-conrady-distortion.js.map +1 -0
- package/dist/optics/circle-of-confusion.d.ts +10 -10
- package/dist/optics/circle-of-confusion.js +15 -11
- package/dist/optics/circle-of-confusion.js.map +1 -1
- package/dist/optics/complex-pupil-psf.d.ts +64 -33
- package/dist/optics/complex-pupil-psf.js +190 -98
- package/dist/optics/complex-pupil-psf.js.map +1 -1
- package/dist/optics/depth-of-field.d.ts +25 -15
- package/dist/optics/depth-of-field.js +67 -27
- package/dist/optics/depth-of-field.js.map +1 -1
- package/dist/optics/diffraction.d.ts +14 -13
- package/dist/optics/diffraction.js +14 -10
- package/dist/optics/diffraction.js.map +1 -1
- package/dist/optics/focus-breathing.d.ts +88 -27
- package/dist/optics/focus-breathing.js +114 -23
- package/dist/optics/focus-breathing.js.map +1 -1
- package/dist/optics/focus-state.d.ts +18 -18
- package/dist/optics/focus-state.js +21 -15
- package/dist/optics/focus-state.js.map +1 -1
- package/dist/optics/front-of-lens-filter.d.ts +45 -14
- package/dist/optics/front-of-lens-filter.js +259 -88
- package/dist/optics/front-of-lens-filter.js.map +1 -1
- package/dist/optics/illumination-vignetting.d.ts +16 -17
- package/dist/optics/illumination-vignetting.js +40 -17
- package/dist/optics/illumination-vignetting.js.map +1 -1
- package/dist/optics/irradiance-convolution.d.ts +59 -0
- package/dist/optics/irradiance-convolution.js +138 -0
- package/dist/optics/irradiance-convolution.js.map +1 -0
- package/dist/optics/lateral-chromatic-aberration.d.ts +33 -30
- package/dist/optics/lateral-chromatic-aberration.js +33 -23
- package/dist/optics/lateral-chromatic-aberration.js.map +1 -1
- package/dist/optics/lens-psf-kernels.d.ts +89 -0
- package/dist/optics/lens-psf-kernels.js +175 -0
- package/dist/optics/lens-psf-kernels.js.map +1 -0
- package/dist/optics/lens-psf-profile.d.ts +78 -46
- package/dist/optics/lens-psf-profile.js +335 -124
- package/dist/optics/lens-psf-profile.js.map +1 -1
- package/dist/optics/longitudinal-chromatic-aberration.d.ts +102 -0
- package/dist/optics/longitudinal-chromatic-aberration.js +210 -0
- package/dist/optics/longitudinal-chromatic-aberration.js.map +1 -0
- package/dist/optics/polygon-diffraction.d.ts +80 -23
- package/dist/optics/polygon-diffraction.js +130 -25
- package/dist/optics/polygon-diffraction.js.map +1 -1
- package/dist/optics/profile-contract.d.ts +5 -6
- package/dist/optics/profile-contract.js +14 -11
- package/dist/optics/profile-contract.js.map +1 -1
- package/dist/optics/psf-foundation.d.ts +23 -23
- package/dist/optics/psf-foundation.js +24 -21
- package/dist/optics/psf-foundation.js.map +1 -1
- package/dist/optics/pupil-vignetting.d.ts +118 -0
- package/dist/optics/pupil-vignetting.js +264 -0
- package/dist/optics/pupil-vignetting.js.map +1 -0
- package/dist/optics/radial-distortion.d.ts +34 -33
- package/dist/optics/radial-distortion.js +37 -30
- package/dist/optics/radial-distortion.js.map +1 -1
- package/dist/optics/scene-to-sensor-irradiance.d.ts +47 -33
- package/dist/optics/scene-to-sensor-irradiance.js +73 -45
- package/dist/optics/scene-to-sensor-irradiance.js.map +1 -1
- package/dist/optics/scene-to-sensor-quadrature.d.ts +23 -18
- package/dist/optics/scene-to-sensor-quadrature.js +16 -11
- package/dist/optics/scene-to-sensor-quadrature.js.map +1 -1
- package/dist/optics/sensor-aperture-rays.d.ts +20 -4
- package/dist/optics/sensor-aperture-rays.js +32 -14
- package/dist/optics/sensor-aperture-rays.js.map +1 -1
- package/dist/optics/sensor-environment-query.d.ts +81 -16
- package/dist/optics/sensor-environment-query.js +145 -12
- package/dist/optics/sensor-environment-query.js.map +1 -1
- package/dist/optics/sensor-psf-quadrature.d.ts +12 -10
- package/dist/optics/sensor-psf-quadrature.js +18 -11
- package/dist/optics/sensor-psf-quadrature.js.map +1 -1
- package/dist/optics/sensor-psf-support.d.ts +8 -6
- package/dist/optics/sensor-psf-support.js +8 -5
- package/dist/optics/sensor-psf-support.js.map +1 -1
- package/dist/optics/stray-light.d.ts +22 -19
- package/dist/optics/stray-light.js +18 -12
- package/dist/optics/stray-light.js.map +1 -1
- package/dist/optics/thin-lens.d.ts +10 -9
- package/dist/optics/thin-lens.js +12 -8
- package/dist/optics/thin-lens.js.map +1 -1
- package/dist/optics/zernike-wavefront.d.ts +154 -0
- package/dist/optics/zernike-wavefront.js +352 -0
- package/dist/optics/zernike-wavefront.js.map +1 -0
- package/dist/output/capture-corrected-sdr.d.ts +16 -8
- package/dist/output/capture-corrected-sdr.js +16 -8
- package/dist/output/capture-corrected-sdr.js.map +1 -1
- package/dist/output/capture-geometry.d.ts +34 -36
- package/dist/output/capture-geometry.js +52 -32
- package/dist/output/capture-geometry.js.map +1 -1
- package/dist/output/capture-sdr.d.ts +7 -6
- package/dist/output/capture-sdr.js +11 -8
- package/dist/output/capture-sdr.js.map +1 -1
- package/dist/output/crop.d.ts +22 -6
- package/dist/output/crop.js +40 -6
- package/dist/output/crop.js.map +1 -1
- package/dist/output/geometric-transforms.d.ts +60 -23
- package/dist/output/geometric-transforms.js +111 -24
- package/dist/output/geometric-transforms.js.map +1 -1
- package/dist/output/lens-corrections.d.ts +27 -19
- package/dist/output/lens-corrections.js +29 -13
- package/dist/output/lens-corrections.js.map +1 -1
- package/dist/output/native-capture-sdr.d.ts +71 -16
- package/dist/output/native-capture-sdr.js +190 -33
- package/dist/output/native-capture-sdr.js.map +1 -1
- package/dist/output/png-encoder.d.ts +65 -0
- package/dist/output/png-encoder.js +461 -0
- package/dist/output/png-encoder.js.map +1 -0
- package/dist/output/print-contrast-reference.d.ts +10 -9
- package/dist/output/print-contrast-reference.js +10 -8
- package/dist/output/print-contrast-reference.js.map +1 -1
- package/dist/output/print-detail.d.ts +18 -17
- package/dist/output/print-detail.js +12 -10
- package/dist/output/print-detail.js.map +1 -1
- package/dist/output/print-jpeg.d.ts +26 -5
- package/dist/output/print-jpeg.js +117 -50
- package/dist/output/print-jpeg.js.map +1 -1
- package/dist/output/print-plan.d.ts +19 -19
- package/dist/output/print-plan.js +11 -10
- package/dist/output/print-plan.js.map +1 -1
- package/dist/output/print-region-statistics.d.ts +14 -15
- package/dist/output/print-region-statistics.js +11 -11
- package/dist/output/print-region-statistics.js.map +1 -1
- package/dist/output/sdr-rendering.d.ts +48 -10
- package/dist/output/sdr-rendering.js +114 -25
- package/dist/output/sdr-rendering.js.map +1 -1
- package/dist/output/subject-framing-crop.d.ts +6 -10
- package/dist/output/subject-framing-crop.js +23 -13
- package/dist/output/subject-framing-crop.js.map +1 -1
- package/dist/processing/demosaic.d.ts +90 -0
- package/dist/processing/demosaic.js +275 -0
- package/dist/processing/demosaic.js.map +1 -0
- package/dist/processing/denoise.d.ts +68 -0
- package/dist/processing/denoise.js +214 -0
- package/dist/processing/denoise.js.map +1 -0
- package/dist/processing/focus-stacking.d.ts +17 -0
- package/dist/processing/focus-stacking.js +80 -0
- package/dist/processing/focus-stacking.js.map +1 -0
- package/dist/processing/hdr.d.ts +54 -0
- package/dist/processing/hdr.js +172 -0
- package/dist/processing/hdr.js.map +1 -0
- package/dist/processing/image-ops.d.ts +66 -0
- package/dist/processing/image-ops.js +192 -0
- package/dist/processing/image-ops.js.map +1 -0
- package/dist/processing/panorama.d.ts +51 -0
- package/dist/processing/panorama.js +305 -0
- package/dist/processing/panorama.js.map +1 -0
- package/dist/processing/processing-task.d.ts +85 -0
- package/dist/processing/processing-task.js +164 -0
- package/dist/processing/processing-task.js.map +1 -0
- package/dist/processing/tone-mapping.d.ts +69 -0
- package/dist/processing/tone-mapping.js +310 -0
- package/dist/processing/tone-mapping.js.map +1 -0
- package/dist/schema/camera.d.ts +5 -4
- package/dist/schema/illumination-spectral.d.ts +13 -19
- package/dist/schema/illumination-spectral.js +23 -19
- package/dist/schema/illumination-spectral.js.map +1 -1
- package/dist/schema/illumination-temporal.d.ts +12 -15
- package/dist/schema/illumination-temporal.js +43 -28
- package/dist/schema/illumination-temporal.js.map +1 -1
- package/dist/schema/illumination.d.ts +5 -4
- package/dist/schema/illumination.js +55 -20
- package/dist/schema/illumination.js.map +1 -1
- package/dist/schema/scene-radiance-temporal.d.ts +9 -11
- package/dist/schema/scene-radiance-temporal.js +26 -23
- package/dist/schema/scene-radiance-temporal.js.map +1 -1
- package/dist/schema/scene-radiance.d.ts +17 -17
- package/dist/schema/scene-radiance.js +56 -34
- package/dist/schema/scene-radiance.js.map +1 -1
- package/dist/schema/scene.d.ts +14 -13
- package/dist/schema/validation.d.ts +0 -1
- package/dist/schema/validation.js +17 -15
- package/dist/schema/validation.js.map +1 -1
- package/dist/sensor/accumulated-charge.d.ts +45 -64
- package/dist/sensor/accumulated-charge.js +41 -47
- package/dist/sensor/accumulated-charge.js.map +1 -1
- package/dist/sensor/architecture.d.ts +22 -25
- package/dist/sensor/architecture.js +17 -16
- package/dist/sensor/architecture.js.map +1 -1
- package/dist/sensor/camera-saturation-capacity.d.ts +21 -28
- package/dist/sensor/camera-saturation-capacity.js +36 -34
- package/dist/sensor/camera-saturation-capacity.js.map +1 -1
- package/dist/sensor/capture-color-sampling-binding.d.ts +46 -51
- package/dist/sensor/capture-color-sampling-binding.js +39 -41
- package/dist/sensor/capture-color-sampling-binding.js.map +1 -1
- package/dist/sensor/capture-mode-timing.d.ts +8 -9
- package/dist/sensor/capture-mode-timing.js +24 -21
- package/dist/sensor/capture-mode-timing.js.map +1 -1
- package/dist/sensor/capture-mode.d.ts +28 -30
- package/dist/sensor/capture-mode.js +33 -31
- package/dist/sensor/capture-mode.js.map +1 -1
- package/dist/sensor/color-sampling.d.ts +30 -33
- package/dist/sensor/color-sampling.js +32 -37
- package/dist/sensor/color-sampling.js.map +1 -1
- package/dist/sensor/constant-rate-temporal-integration.d.ts +19 -23
- package/dist/sensor/constant-rate-temporal-integration.js +28 -26
- package/dist/sensor/constant-rate-temporal-integration.js.map +1 -1
- package/dist/sensor/dark-current.d.ts +53 -49
- package/dist/sensor/dark-current.js +87 -46
- package/dist/sensor/dark-current.js.map +1 -1
- package/dist/sensor/environment-photo-signal.d.ts +71 -30
- package/dist/sensor/environment-photo-signal.js +127 -46
- package/dist/sensor/environment-photo-signal.js.map +1 -1
- package/dist/sensor/eqe-electron-rate.d.ts +14 -13
- package/dist/sensor/eqe-electron-rate.js +34 -14
- package/dist/sensor/eqe-electron-rate.js.map +1 -1
- package/dist/sensor/eqe-local-exposure.d.ts +24 -24
- package/dist/sensor/eqe-local-exposure.js +15 -11
- package/dist/sensor/eqe-local-exposure.js.map +1 -1
- package/dist/sensor/eqe-temporal-exposure.d.ts +11 -11
- package/dist/sensor/eqe-temporal-exposure.js +15 -10
- package/dist/sensor/eqe-temporal-exposure.js.map +1 -1
- package/dist/sensor/exposure-window.d.ts +48 -34
- package/dist/sensor/exposure-window.js +77 -36
- package/dist/sensor/exposure-window.js.map +1 -1
- package/dist/sensor/fixed-pattern-noise.d.ts +108 -0
- package/dist/sensor/fixed-pattern-noise.js +166 -0
- package/dist/sensor/fixed-pattern-noise.js.map +1 -0
- package/dist/sensor/iso-gain.d.ts +44 -0
- package/dist/sensor/iso-gain.js +119 -0
- package/dist/sensor/iso-gain.js.map +1 -0
- package/dist/sensor/iso-signal-chain.d.ts +25 -48
- package/dist/sensor/iso-signal-chain.js +52 -66
- package/dist/sensor/iso-signal-chain.js.map +1 -1
- package/dist/sensor/local-exposure-binding.d.ts +21 -21
- package/dist/sensor/local-exposure-binding.js +22 -18
- package/dist/sensor/local-exposure-binding.js.map +1 -1
- package/dist/sensor/optical-stack.d.ts +36 -40
- package/dist/sensor/optical-stack.js +34 -37
- package/dist/sensor/optical-stack.js.map +1 -1
- package/dist/sensor/photon-energy.d.ts +22 -28
- package/dist/sensor/photon-energy.js +42 -34
- package/dist/sensor/photon-energy.js.map +1 -1
- package/dist/sensor/physical-charge-capacity.d.ts +20 -30
- package/dist/sensor/physical-charge-capacity.js +35 -36
- package/dist/sensor/physical-charge-capacity.js.map +1 -1
- package/dist/sensor/pixel-pitch.d.ts +2 -3
- package/dist/sensor/pixel-pitch.js +4 -2
- package/dist/sensor/pixel-pitch.js.map +1 -1
- package/dist/sensor/radiometry-readiness.d.ts +13 -15
- package/dist/sensor/radiometry-readiness.js +20 -17
- package/dist/sensor/radiometry-readiness.js.map +1 -1
- package/dist/sensor/raw-readout.d.ts +173 -83
- package/dist/sensor/raw-readout.js +425 -160
- package/dist/sensor/raw-readout.js.map +1 -1
- package/dist/sensor/raw-reconstruction.d.ts +112 -44
- package/dist/sensor/raw-reconstruction.js +200 -47
- package/dist/sensor/raw-reconstruction.js.map +1 -1
- package/dist/sensor/readout-exposure-linkage.d.ts +103 -34
- package/dist/sensor/readout-exposure-linkage.js +125 -27
- package/dist/sensor/readout-exposure-linkage.js.map +1 -1
- package/dist/sensor/readout-timing.d.ts +43 -44
- package/dist/sensor/readout-timing.js +38 -30
- package/dist/sensor/readout-timing.js.map +1 -1
- package/dist/sensor/response-application-compatibility.d.ts +21 -28
- package/dist/sensor/response-application-compatibility.js +35 -34
- package/dist/sensor/response-application-compatibility.js.map +1 -1
- package/dist/sensor/response-operating-range.d.ts +26 -35
- package/dist/sensor/response-operating-range.js +40 -39
- package/dist/sensor/response-operating-range.js.map +1 -1
- package/dist/sensor/responsivity-photocurrent.d.ts +21 -29
- package/dist/sensor/responsivity-photocurrent.js +57 -40
- package/dist/sensor/responsivity-photocurrent.js.map +1 -1
- package/dist/sensor/sampling-aperture.d.ts +21 -25
- package/dist/sensor/sampling-aperture.js +29 -28
- package/dist/sensor/sampling-aperture.js.map +1 -1
- package/dist/sensor/scene-eqe-temporal-exposure.d.ts +14 -12
- package/dist/sensor/scene-eqe-temporal-exposure.js +13 -8
- package/dist/sensor/scene-eqe-temporal-exposure.js.map +1 -1
- package/dist/sensor/sensor-geometry.d.ts +28 -32
- package/dist/sensor/sensor-geometry.js +35 -20
- package/dist/sensor/sensor-geometry.js.map +1 -1
- package/dist/sensor/signal-noise.d.ts +14 -16
- package/dist/sensor/signal-noise.js +15 -13
- package/dist/sensor/signal-noise.js.map +1 -1
- package/dist/sensor/spatial-sample-reduction.d.ts +45 -60
- package/dist/sensor/spatial-sample-reduction.js +39 -48
- package/dist/sensor/spatial-sample-reduction.js.map +1 -1
- package/dist/sensor/spatial-sampling-quadrature.d.ts +46 -54
- package/dist/sensor/spatial-sampling-quadrature.js +31 -36
- package/dist/sensor/spatial-sampling-quadrature.js.map +1 -1
- package/dist/sensor/spatio-spectral-reduction.d.ts +32 -42
- package/dist/sensor/spatio-spectral-reduction.js +24 -29
- package/dist/sensor/spatio-spectral-reduction.js.map +1 -1
- package/dist/sensor/spectral-coverage.d.ts +6 -9
- package/dist/sensor/spectral-coverage.js +9 -6
- package/dist/sensor/spectral-coverage.js.map +1 -1
- package/dist/sensor/spectral-quadrature.d.ts +46 -60
- package/dist/sensor/spectral-quadrature.js +38 -48
- package/dist/sensor/spectral-quadrature.js.map +1 -1
- package/dist/sensor/spectral-response.d.ts +53 -41
- package/dist/sensor/spectral-response.js +80 -47
- package/dist/sensor/spectral-response.js.map +1 -1
- package/dist/sensor/stochastic-seed.d.ts +50 -0
- package/dist/sensor/stochastic-seed.js +123 -0
- package/dist/sensor/stochastic-seed.js.map +1 -0
- package/dist/sensor/temporal-eqe-sum.d.ts +2 -4
- package/dist/sensor/temporal-eqe-sum.js +5 -6
- package/dist/sensor/temporal-eqe-sum.js.map +1 -1
- package/dist/sensor/temporal-photo-signal.d.ts +5 -6
- package/dist/sensor/temporal-photo-signal.js +11 -10
- package/dist/sensor/temporal-photo-signal.js.map +1 -1
- package/dist/sensor/temporal-sample-binding.d.ts +1 -2
- package/dist/sensor/temporal-sample-binding.js +3 -3
- package/dist/sensor/temporal-sample-binding.js.map +1 -1
- package/dist/simulation/poc-simulation.d.ts +16 -16
- package/dist/simulation/poc-simulation.js +20 -15
- package/dist/simulation/poc-simulation.js.map +1 -1
- package/dist/stabilization/camera-shake.d.ts +42 -18
- package/dist/stabilization/camera-shake.js +43 -20
- package/dist/stabilization/camera-shake.js.map +1 -1
- package/dist/stabilization/system.d.ts +44 -41
- package/dist/stabilization/system.js +196 -108
- package/dist/stabilization/system.js.map +1 -1
- package/docs/AGENT_GUIDE.md +183 -0
- package/docs/API_REFERENCE.md +761 -2
- package/docs/QUICK_START.md +495 -0
- package/docs/USAGE.md +1719 -714
- package/docs/api/camera-equivalent-focal-length.md +6 -7
- package/docs/api/camera-field-of-view.md +16 -8
- package/docs/api/camera-lens-projection.md +246 -0
- package/docs/api/camera-projected-object-size.md +6 -5
- package/docs/api/capture-capture-export-metadata.md +10 -10
- package/docs/api/capture-dng-import.md +134 -0
- package/docs/api/capture-environment-raw-producer.md +17 -11
- package/docs/api/capture-export-jpeg.md +16 -0
- package/docs/api/capture-focus-control.md +25 -47
- package/docs/api/capture-linear-encoding.md +21 -12
- package/docs/api/capture-lossless-jpeg.md +49 -0
- package/docs/api/capture-native-environment-optical-stage.md +75 -0
- package/docs/api/capture-native-environment-raw.md +161 -4
- package/docs/api/capture-native-raw-development.md +69 -4
- package/docs/api/capture-native-raw-dng.md +84 -0
- package/docs/api/capture-native-raw.md +23 -8
- package/docs/api/capture-packed-sensor-raw.md +156 -0
- package/docs/api/capture-photographic-export.md +69 -31
- package/docs/api/capture-raw-frame-reconstruction.md +8 -8
- package/docs/api/capture-raw-white-level.md +37 -0
- package/docs/api/capture-release-sequence.md +6 -7
- package/docs/api/capture-sensor-raw-frame.md +6 -6
- package/docs/api/capture-sensor-raw-producer.md +17 -11
- package/docs/api/capture-simulated-capture.md +15 -15
- package/docs/api/color-camera-color-matrix.md +103 -0
- package/docs/api/color-capture-color.md +22 -11
- package/docs/api/color-chromatic-adaptation.md +82 -0
- package/docs/api/color-color-difference.md +134 -0
- package/docs/api/color-color-matching-functions.md +259 -0
- package/docs/api/color-colorimetry-math.md +54 -0
- package/docs/api/color-gamut-mapping.md +72 -0
- package/docs/api/color-illuminants.md +280 -0
- package/docs/api/color-rgb-color-spaces.md +151 -0
- package/docs/api/color-sensor-color-development.md +27 -0
- package/docs/api/color-srgb-icc.md +2 -4
- package/docs/api/color-white-balance.md +95 -19
- package/docs/api/composition-image-formation-plan.md +124 -95
- package/docs/api/composition-plan-consumer.md +7 -7
- package/docs/api/core-calculation-result.md +18 -14
- package/docs/api/core-configuration-error.md +1 -1
- package/docs/api/core-image-formation.md +7 -7
- package/docs/api/core-scientific-assurance.md +12 -10
- package/docs/api/core-spectral-composition.md +14 -14
- package/docs/api/core-spectral.md +6 -6
- package/docs/api/core-validation.md +3 -3
- package/docs/api/core-version.md +7 -6
- package/docs/api/equipment-exposure-capabilities.md +11 -10
- package/docs/api/equipment-generic-tier-assets.md +7 -2
- package/docs/api/equipment-generic-tier-presets.md +6 -6
- package/docs/api/equipment-iso-capabilities.md +18 -18
- package/docs/api/equipment-metering-capabilities.md +6 -6
- package/docs/api/equipment-release-capabilities.md +4 -4
- package/docs/api/exports.json +2213 -8
- package/docs/api/exposure-exposure-duration-control.md +9 -9
- package/docs/api/exposure-exposure-mode-resolver.md +35 -31
- package/docs/api/exposure-exposure.md +10 -10
- package/docs/api/exposure-flash-ttl.md +182 -0
- package/docs/api/exposure-flash.md +183 -28
- package/docs/api/exposure-metering-scene-radiance.md +11 -10
- package/docs/api/exposure-metering-target.md +9 -8
- package/docs/api/exposure-metering-temporal.md +8 -8
- package/docs/api/exposure-metering.md +69 -9
- package/docs/api/exposure-program-line.md +6 -5
- package/docs/api/facade-chart-radiance-batch.md +96 -0
- package/docs/api/facade-chart-scenes.md +240 -0
- package/docs/api/facade-scene-radiance.md +122 -0
- package/docs/api/facade-simulate-capture.md +324 -0
- package/docs/api/gpu-image-kernel-accelerator.md +157 -0
- package/docs/api/gpu-image-kernel-execution.md +152 -0
- package/docs/api/motion-camera-rotation.md +43 -26
- package/docs/api/motion-capture-rotation-inverse-mapping.md +24 -23
- package/docs/api/motion-capture-rotation-temporal-quadrature.md +22 -22
- package/docs/api/motion-capture-rotation-trajectory.md +15 -15
- package/docs/api/motion-capture-translation-parallax-temporal-quadrature.md +15 -14
- package/docs/api/motion-extended-object-projection.md +10 -8
- package/docs/api/motion-projected-motion.md +8 -8
- package/docs/api/motion-temporal-exposure-sum.md +98 -0
- package/docs/api/motion-video-sequence.md +159 -0
- package/docs/api/optics-aperture.md +8 -8
- package/docs/api/optics-atmospheric-haze.md +104 -0
- package/docs/api/optics-brown-conrady-distortion.md +123 -0
- package/docs/api/optics-circle-of-confusion.md +5 -4
- package/docs/api/optics-complex-pupil-psf.md +57 -16
- package/docs/api/optics-depth-of-field.md +12 -6
- package/docs/api/optics-diffraction.md +8 -7
- package/docs/api/optics-focus-breathing.md +104 -16
- package/docs/api/optics-focus-state.md +9 -10
- package/docs/api/optics-front-of-lens-filter.md +72 -14
- package/docs/api/optics-illumination-vignetting.md +10 -10
- package/docs/api/optics-irradiance-convolution.md +95 -0
- package/docs/api/optics-lateral-chromatic-aberration.md +22 -21
- package/docs/api/optics-lens-psf-kernels.md +72 -0
- package/docs/api/optics-lens-psf-profile.md +48 -26
- package/docs/api/optics-longitudinal-chromatic-aberration.md +128 -0
- package/docs/api/optics-polygon-diffraction.md +78 -13
- package/docs/api/optics-profile-contract.md +4 -4
- package/docs/api/optics-psf-foundation.md +12 -12
- package/docs/api/optics-pupil-vignetting.md +132 -0
- package/docs/api/optics-radial-distortion.md +12 -12
- package/docs/api/optics-scene-to-sensor-irradiance.md +25 -14
- package/docs/api/optics-scene-to-sensor-quadrature.md +15 -12
- package/docs/api/optics-sensor-aperture-rays.md +3 -2
- package/docs/api/optics-sensor-environment-query.md +52 -9
- package/docs/api/optics-sensor-psf-quadrature.md +13 -10
- package/docs/api/optics-stray-light.md +12 -11
- package/docs/api/optics-thin-lens.md +4 -3
- package/docs/api/optics-zernike-wavefront.md +229 -0
- package/docs/api/output-capture-corrected-sdr.md +10 -7
- package/docs/api/output-capture-geometry.md +35 -36
- package/docs/api/output-capture-sdr.md +4 -4
- package/docs/api/output-crop.md +7 -4
- package/docs/api/output-geometric-transforms.md +65 -19
- package/docs/api/output-lens-corrections.md +17 -15
- package/docs/api/output-native-capture-sdr.md +26 -13
- package/docs/api/output-png-encoder.md +105 -0
- package/docs/api/output-print-contrast-reference.md +8 -8
- package/docs/api/output-print-detail.md +14 -14
- package/docs/api/output-print-jpeg.md +22 -5
- package/docs/api/output-print-plan.md +18 -18
- package/docs/api/output-print-region-statistics.md +14 -14
- package/docs/api/output-sdr-rendering.md +52 -10
- package/docs/api/output-subject-framing-crop.md +5 -6
- package/docs/api/processing-demosaic.md +120 -0
- package/docs/api/processing-denoise.md +148 -0
- package/docs/api/processing-focus-stacking.md +41 -0
- package/docs/api/processing-hdr.md +113 -0
- package/docs/api/processing-panorama.md +82 -0
- package/docs/api/processing-processing-task.md +107 -0
- package/docs/api/processing-tone-mapping.md +142 -0
- package/docs/api/schema-camera.md +6 -4
- package/docs/api/schema-illumination-spectral.md +10 -11
- package/docs/api/schema-illumination-temporal.md +13 -15
- package/docs/api/schema-illumination.md +4 -4
- package/docs/api/schema-scene-radiance-temporal.md +10 -11
- package/docs/api/schema-scene-radiance.md +18 -17
- package/docs/api/schema-scene.md +9 -9
- package/docs/api/schema-validation.md +1 -1
- package/docs/api/sensor-accumulated-charge.md +12 -20
- package/docs/api/sensor-architecture.md +15 -16
- package/docs/api/sensor-camera-saturation-capacity.md +9 -11
- package/docs/api/sensor-capture-color-sampling-binding.md +47 -51
- package/docs/api/sensor-capture-mode-timing.md +9 -9
- package/docs/api/sensor-capture-mode.md +29 -30
- package/docs/api/sensor-color-sampling.md +31 -33
- package/docs/api/sensor-constant-rate-temporal-integration.md +10 -11
- package/docs/api/sensor-dark-current.md +30 -14
- package/docs/api/sensor-environment-photo-signal.md +13 -6
- package/docs/api/sensor-eqe-electron-rate.md +9 -8
- package/docs/api/sensor-eqe-local-exposure.md +18 -17
- package/docs/api/sensor-eqe-temporal-exposure.md +12 -11
- package/docs/api/sensor-exposure-window.md +24 -24
- package/docs/api/sensor-fixed-pattern-noise.md +104 -0
- package/docs/api/sensor-iso-gain.md +63 -0
- package/docs/api/sensor-iso-signal-chain.md +13 -22
- package/docs/api/sensor-local-exposure-binding.md +12 -13
- package/docs/api/sensor-optical-stack.md +37 -40
- package/docs/api/sensor-photon-energy.md +10 -11
- package/docs/api/sensor-physical-charge-capacity.md +8 -13
- package/docs/api/sensor-pixel-pitch.md +1 -1
- package/docs/api/sensor-radiometry-readiness.md +9 -9
- package/docs/api/sensor-raw-readout.md +118 -52
- package/docs/api/sensor-raw-reconstruction.md +97 -20
- package/docs/api/sensor-readout-exposure-linkage.md +120 -24
- package/docs/api/sensor-readout-timing.md +33 -35
- package/docs/api/sensor-response-application-compatibility.md +9 -11
- package/docs/api/sensor-response-operating-range.md +14 -18
- package/docs/api/sensor-responsivity-photocurrent.md +9 -12
- package/docs/api/sensor-sampling-aperture.md +22 -25
- package/docs/api/sensor-scene-eqe-temporal-exposure.md +9 -8
- package/docs/api/sensor-sensor-geometry.md +23 -24
- package/docs/api/sensor-signal-noise.md +10 -10
- package/docs/api/sensor-spatial-sample-reduction.md +27 -30
- package/docs/api/sensor-spatial-sampling-quadrature.md +37 -39
- package/docs/api/sensor-spatio-spectral-reduction.md +27 -29
- package/docs/api/sensor-spectral-coverage.md +5 -5
- package/docs/api/sensor-spectral-quadrature.md +33 -35
- package/docs/api/sensor-spectral-response.md +28 -16
- package/docs/api/sensor-temporal-photo-signal.md +6 -6
- package/docs/api/simulation-poc-simulation.md +17 -16
- package/docs/api/stabilization-camera-shake.md +29 -10
- package/docs/api/stabilization-system.md +25 -21
- package/docs/examples/production-request.json +3821 -2157
- package/docs/examples/simulate-capture.mjs +14 -0
- package/llms.txt +35 -0
- package/package.json +32 -12
- package/AGENTS.md +0 -674
- package/CONTRIBUTING.md +0 -76
- package/DCO +0 -33
- package/dist/camera/equivalent-focal-length.d.ts.map +0 -1
- package/dist/camera/field-of-view.d.ts.map +0 -1
- package/dist/camera/projected-object-size.d.ts.map +0 -1
- package/dist/capture/capture-export-metadata.d.ts.map +0 -1
- package/dist/capture/environment-raw-producer.d.ts.map +0 -1
- package/dist/capture/export-jpeg.d.ts.map +0 -1
- package/dist/capture/export-tiff.d.ts.map +0 -1
- package/dist/capture/focus-control.d.ts.map +0 -1
- package/dist/capture/linear-encoding.d.ts.map +0 -1
- package/dist/capture/native-environment-raw.d.ts.map +0 -1
- package/dist/capture/native-raw-development.d.ts.map +0 -1
- package/dist/capture/native-raw.d.ts.map +0 -1
- package/dist/capture/photographic-export.d.ts.map +0 -1
- package/dist/capture/raw-frame-limits.d.ts.map +0 -1
- package/dist/capture/raw-frame-reconstruction.d.ts.map +0 -1
- package/dist/capture/release-sequence.d.ts.map +0 -1
- package/dist/capture/sensor-raw-frame.d.ts.map +0 -1
- package/dist/capture/sensor-raw-producer.d.ts.map +0 -1
- package/dist/capture/simulated-capture.d.ts.map +0 -1
- package/dist/color/capture-color.d.ts.map +0 -1
- package/dist/color/sensor-color-development.d.ts.map +0 -1
- package/dist/color/srgb-icc.d.ts.map +0 -1
- package/dist/color/srgb-transfer.d.ts.map +0 -1
- package/dist/color/white-balance.d.ts.map +0 -1
- package/dist/composition/image-formation-plan.d.ts.map +0 -1
- package/dist/composition/plan-consumer.d.ts.map +0 -1
- package/dist/core/calculation-result.d.ts.map +0 -1
- package/dist/core/canonical-json.d.ts.map +0 -1
- package/dist/core/configuration-error.d.ts.map +0 -1
- package/dist/core/evidence-provenance.d.ts.map +0 -1
- package/dist/core/image-formation.d.ts.map +0 -1
- package/dist/core/owned-data.d.ts.map +0 -1
- package/dist/core/record-validation.d.ts.map +0 -1
- package/dist/core/scientific-assurance.d.ts.map +0 -1
- package/dist/core/spectral-composition.d.ts.map +0 -1
- package/dist/core/spectral.d.ts.map +0 -1
- package/dist/core/validation.d.ts.map +0 -1
- package/dist/core/version.d.ts.map +0 -1
- package/dist/equipment/exposure-capabilities.d.ts.map +0 -1
- package/dist/equipment/generic-tier-assets.d.ts.map +0 -1
- package/dist/equipment/generic-tier-presets.d.ts.map +0 -1
- package/dist/equipment/iso-capabilities.d.ts.map +0 -1
- package/dist/equipment/metering-capabilities.d.ts.map +0 -1
- package/dist/equipment/release-capabilities.d.ts.map +0 -1
- package/dist/exposure/exposure-duration-control.d.ts.map +0 -1
- package/dist/exposure/exposure-mode-resolver.d.ts.map +0 -1
- package/dist/exposure/exposure.d.ts.map +0 -1
- package/dist/exposure/flash.d.ts.map +0 -1
- package/dist/exposure/metering-scene-radiance.d.ts.map +0 -1
- package/dist/exposure/metering-target.d.ts.map +0 -1
- package/dist/exposure/metering-temporal.d.ts.map +0 -1
- package/dist/exposure/metering.d.ts.map +0 -1
- package/dist/exposure/program-line.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/motion/camera-rotation.d.ts.map +0 -1
- package/dist/motion/capture-rotation-inverse-mapping.d.ts.map +0 -1
- package/dist/motion/capture-rotation-temporal-quadrature.d.ts.map +0 -1
- package/dist/motion/capture-rotation-trajectory.d.ts.map +0 -1
- package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts.map +0 -1
- package/dist/motion/extended-object-projection.d.ts.map +0 -1
- package/dist/motion/projected-motion.d.ts.map +0 -1
- package/dist/optics/aperture.d.ts.map +0 -1
- package/dist/optics/circle-of-confusion.d.ts.map +0 -1
- package/dist/optics/complex-pupil-psf.d.ts.map +0 -1
- package/dist/optics/depth-of-field.d.ts.map +0 -1
- package/dist/optics/diffraction.d.ts.map +0 -1
- package/dist/optics/focus-breathing.d.ts.map +0 -1
- package/dist/optics/focus-state.d.ts.map +0 -1
- package/dist/optics/front-of-lens-filter.d.ts.map +0 -1
- package/dist/optics/illumination-vignetting.d.ts.map +0 -1
- package/dist/optics/lateral-chromatic-aberration.d.ts.map +0 -1
- package/dist/optics/lens-psf-profile.d.ts.map +0 -1
- package/dist/optics/polygon-diffraction.d.ts.map +0 -1
- package/dist/optics/profile-contract.d.ts.map +0 -1
- package/dist/optics/psf-foundation.d.ts.map +0 -1
- package/dist/optics/radial-distortion.d.ts.map +0 -1
- package/dist/optics/scene-to-sensor-irradiance.d.ts.map +0 -1
- package/dist/optics/scene-to-sensor-quadrature.d.ts.map +0 -1
- package/dist/optics/sensor-aperture-rays.d.ts.map +0 -1
- package/dist/optics/sensor-environment-query.d.ts.map +0 -1
- package/dist/optics/sensor-psf-quadrature.d.ts.map +0 -1
- package/dist/optics/sensor-psf-support.d.ts.map +0 -1
- package/dist/optics/stray-light.d.ts.map +0 -1
- package/dist/optics/thin-lens.d.ts.map +0 -1
- package/dist/output/capture-corrected-sdr.d.ts.map +0 -1
- package/dist/output/capture-geometry.d.ts.map +0 -1
- package/dist/output/capture-sdr.d.ts.map +0 -1
- package/dist/output/crop.d.ts.map +0 -1
- package/dist/output/geometric-transforms.d.ts.map +0 -1
- package/dist/output/lens-corrections.d.ts.map +0 -1
- package/dist/output/native-capture-sdr.d.ts.map +0 -1
- package/dist/output/print-contrast-reference.d.ts.map +0 -1
- package/dist/output/print-detail.d.ts.map +0 -1
- package/dist/output/print-jpeg.d.ts.map +0 -1
- package/dist/output/print-plan.d.ts.map +0 -1
- package/dist/output/print-region-statistics.d.ts.map +0 -1
- package/dist/output/sdr-rendering.d.ts.map +0 -1
- package/dist/output/subject-framing-crop.d.ts.map +0 -1
- package/dist/schema/camera.d.ts.map +0 -1
- package/dist/schema/camera.js +0 -3
- package/dist/schema/camera.js.map +0 -1
- package/dist/schema/illumination-spectral.d.ts.map +0 -1
- package/dist/schema/illumination-temporal.d.ts.map +0 -1
- package/dist/schema/illumination.d.ts.map +0 -1
- package/dist/schema/scene-radiance-temporal.d.ts.map +0 -1
- package/dist/schema/scene-radiance.d.ts.map +0 -1
- package/dist/schema/scene.d.ts.map +0 -1
- package/dist/schema/scene.js +0 -3
- package/dist/schema/scene.js.map +0 -1
- package/dist/schema/validation.d.ts.map +0 -1
- package/dist/sensor/accumulated-charge.d.ts.map +0 -1
- package/dist/sensor/architecture.d.ts.map +0 -1
- package/dist/sensor/camera-saturation-capacity.d.ts.map +0 -1
- package/dist/sensor/capture-color-sampling-binding.d.ts.map +0 -1
- package/dist/sensor/capture-mode-timing.d.ts.map +0 -1
- package/dist/sensor/capture-mode.d.ts.map +0 -1
- package/dist/sensor/color-sampling.d.ts.map +0 -1
- package/dist/sensor/constant-rate-temporal-integration.d.ts.map +0 -1
- package/dist/sensor/dark-current.d.ts.map +0 -1
- package/dist/sensor/environment-photo-signal.d.ts.map +0 -1
- package/dist/sensor/eqe-electron-rate.d.ts.map +0 -1
- package/dist/sensor/eqe-local-exposure.d.ts.map +0 -1
- package/dist/sensor/eqe-temporal-exposure.d.ts.map +0 -1
- package/dist/sensor/exposure-window.d.ts.map +0 -1
- package/dist/sensor/iso-signal-chain.d.ts.map +0 -1
- package/dist/sensor/local-exposure-binding.d.ts.map +0 -1
- package/dist/sensor/optical-stack.d.ts.map +0 -1
- package/dist/sensor/photon-energy.d.ts.map +0 -1
- package/dist/sensor/physical-charge-capacity.d.ts.map +0 -1
- package/dist/sensor/pixel-pitch.d.ts.map +0 -1
- package/dist/sensor/radiometry-readiness.d.ts.map +0 -1
- package/dist/sensor/raw-readout.d.ts.map +0 -1
- package/dist/sensor/raw-reconstruction.d.ts.map +0 -1
- package/dist/sensor/readout-exposure-linkage.d.ts.map +0 -1
- package/dist/sensor/readout-timing.d.ts.map +0 -1
- package/dist/sensor/response-application-compatibility.d.ts.map +0 -1
- package/dist/sensor/response-operating-range.d.ts.map +0 -1
- package/dist/sensor/responsivity-photocurrent.d.ts.map +0 -1
- package/dist/sensor/sampling-aperture.d.ts.map +0 -1
- package/dist/sensor/scene-eqe-temporal-exposure.d.ts.map +0 -1
- package/dist/sensor/sensor-geometry.d.ts.map +0 -1
- package/dist/sensor/signal-noise.d.ts.map +0 -1
- package/dist/sensor/spatial-sample-reduction.d.ts.map +0 -1
- package/dist/sensor/spatial-sampling-quadrature.d.ts.map +0 -1
- package/dist/sensor/spatio-spectral-reduction.d.ts.map +0 -1
- package/dist/sensor/spectral-coverage.d.ts.map +0 -1
- package/dist/sensor/spectral-quadrature.d.ts.map +0 -1
- package/dist/sensor/spectral-response.d.ts.map +0 -1
- package/dist/sensor/temporal-eqe-sum.d.ts.map +0 -1
- package/dist/sensor/temporal-photo-signal.d.ts.map +0 -1
- package/dist/sensor/temporal-sample-binding.d.ts.map +0 -1
- package/dist/simulation/poc-simulation.d.ts.map +0 -1
- package/dist/stabilization/camera-shake.d.ts.map +0 -1
- package/dist/stabilization/system.d.ts.map +0 -1
- package/docs/API_STYLE.md +0 -235
- package/docs/ARCHITECTURE.md +0 -356
- package/docs/AUTOMATION_COORDINATION.md +0 -190
- package/docs/CAPTURE_COLOR.md +0 -25
- package/docs/CAPTURE_CORRECTED_SDR.md +0 -25
- package/docs/CAPTURE_EXPORT_METADATA.md +0 -27
- package/docs/CAPTURE_SDR.md +0 -22
- package/docs/DEVELOPERS.md +0 -68
- package/docs/DIGITAL_OPTICS_FOUNDATION.md +0 -69
- package/docs/ENVIRONMENT_RAW_CAPTURE.md +0 -208
- package/docs/EXPORT_ACCEPTANCE.md +0 -133
- package/docs/GENERIC_TIER_PRESETS.md +0 -269
- package/docs/GEOMETRIC_PREPARATION_REUSE.md +0 -141
- package/docs/IMAGE_FORMATION.md +0 -247
- package/docs/LINEAR_CAPTURE_ENCODING.md +0 -25
- package/docs/MOTION_AND_SIGNAL.md +0 -250
- package/docs/NATIVE_CAPTURE_SDR.md +0 -70
- package/docs/NATIVE_CAPTURE_SDR_REVIEW.md +0 -37
- package/docs/NATIVE_CAPTURE_SDR_VALIDATION.md +0 -34
- package/docs/NATIVE_RAW_AND_PRINT.md +0 -47
- package/docs/NUMERICAL_CORRECTNESS.md +0 -191
- package/docs/PERFORMANCE_BASELINE.md +0 -56
- package/docs/PHOTOGRAPHIC_EXPORT.md +0 -206
- package/docs/PHYSICS_FOUNDATION.md +0 -426
- package/docs/POC_API.md +0 -278
- package/docs/POC_PROJECTION_PLATFORM_REFERENCE.md +0 -12
- package/docs/POC_PROJECTION_REUSE.md +0 -124
- package/docs/PRINT_195_196_REVIEW.md +0 -93
- package/docs/PRINT_196_ENGINE_ACCEPTANCE.md +0 -45
- package/docs/PRINT_CONTRAST_REFERENCE.md +0 -43
- package/docs/PRINT_DETAIL_ASSESSMENT.md +0 -81
- package/docs/PRINT_DETAIL_JPEG_EVIDENCE.md +0 -36
- package/docs/PRINT_DETAIL_SDR_EVIDENCE.md +0 -29
- package/docs/PRINT_DETAIL_VALIDATION.md +0 -36
- package/docs/PRINT_PLANNING.md +0 -75
- package/docs/PRINT_REGION_STATISTICS.md +0 -38
- package/docs/PROCESSED_OUTPUT.md +0 -157
- package/docs/PRODUCTION_COMPOSITION.md +0 -373
- package/docs/PRODUCTION_ENVIRONMENT_CAPTURE.md +0 -131
- package/docs/PROVENANCE.md +0 -115
- package/docs/PSF_FOUNDATION.md +0 -165
- package/docs/RAW_FRAME_ENVELOPE.md +0 -56
- package/docs/RAW_FRAME_RECONSTRUCTION.md +0 -30
- package/docs/RELEASE_1_0.md +0 -66
- package/docs/RELEASE_1_0_1.md +0 -61
- package/docs/RELEASE_1_1_0.md +0 -25
- package/docs/RELEASE_1_2_0.md +0 -51
- package/docs/RELEASE_1_3_0.md +0 -15
- package/docs/RELEASE_1_4_0.md +0 -23
- package/docs/RELEASE_AUDIT.md +0 -39
- package/docs/SCENE_RADIANCE_AND_ILLUMINATION.md +0 -298
- package/docs/SCENE_SENSOR_QUADRATURE.md +0 -98
- package/docs/SCENE_SENSOR_TEMPORAL_EXPOSURE.md +0 -86
- package/docs/SCIENTIFIC_ASSURANCE.md +0 -280
- package/docs/SCIENTIFIC_CONFORMANCE.md +0 -83
- package/docs/SDR_RENDERING.md +0 -33
- package/docs/SENSOR_APERTURE_RAYS.md +0 -23
- package/docs/SENSOR_ENVIRONMENT_QUERY.md +0 -86
- package/docs/SENSOR_EQE_LOCAL_EXPOSURE.md +0 -104
- package/docs/SENSOR_EQE_TEMPORAL_EXPOSURE.md +0 -74
- package/docs/SENSOR_PSF_QUADRATURE.md +0 -90
- package/docs/SENSOR_RAW_FRAME.md +0 -20
- package/docs/SENSOR_RAW_PRODUCER.md +0 -77
- package/docs/SIGNAL_CONFORMANCE.md +0 -23
- package/docs/SIMULATED_CAPTURE.md +0 -65
- package/docs/STABILIZATION.md +0 -234
- package/docs/TEMPORAL_PHOTO_RAW.md +0 -83
- package/docs/TIER_ACCEPTANCE.md +0 -129
- package/docs/TIER_PRESET_ACCEPTANCE.md +0 -59
- package/docs/V1_COMPOSITION_MAP.md +0 -123
- package/docs/V1_HELPER_REUSE_REVIEW.md +0 -60
- package/docs/V1_PERFORMANCE_DISPOSITION.md +0 -88
- package/docs/benchmarks/2026-10-01-main-baseline.json +0 -694
- package/docs/benchmarks/2026-10-02-geometric-preparation-reuse.json +0 -2190
- package/docs/benchmarks/2026-10-02-poc-projection-reuse.json +0 -2423
- package/docs/benchmarks/2026-10-02-v1-environment-gc-profile.json +0 -210
- package/docs/benchmarks/2026-10-02-v1-environment-ordinary.json +0 -187
- package/docs/benchmarks/2026-10-02-v1-geometry-gc-profile.json +0 -756
- package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-1.json +0 -711
- package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-2.json +0 -711
- package/docs/benchmarks/2026-10-02-v1-poc-gc-profile.json +0 -885
- package/docs/benchmarks/2026-10-02-v1-poc-ordinary-1.json +0 -868
- package/docs/benchmarks/2026-10-02-v1-poc-ordinary-2.json +0 -868
- package/docs/licenses/castleCSF-MIT.txt +0 -21
- package/docs/validation/documentation-fragments.json +0 -212
- package/docs/validation/native-capture-sdr-darwin-arm64-node26-review.jsonl +0 -4
- package/docs/validation/native-capture-sdr-darwin-arm64.jsonl +0 -3
- package/docs/validation/native-raw-print-2026-10-04/fractional-asymmetric-crop.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/gray-ramp.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/linear-area-checker.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/manifest.json +0 -218
- package/docs/validation/native-raw-print-2026-10-04/megapixel-native.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/native-color.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel-validation.json +0 -9
- package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json +0 -29
- package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.codes.u16le.gz +0 -0
- package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.rgb.gz +0 -0
- package/docs/validation/native-raw-print-2026-10-04/srgb.icc +0 -0
- package/docs/validation/native-raw-print-2026-10-04/validation.json +0 -41
- package/docs/validation/print-196-candidate-capabilities.json +0 -28
- package/docs/validation/print-196-candidate-evidence.json +0 -356
- package/docs/validation/print-196-engine-acceptance.json +0 -81
- package/docs/validation/print-detail-capabilities.json +0 -103
- package/docs/validation/print-detail-jpeg-evidence.json +0 -116
- package/docs/validation/print-detail-sdr-evidence.json +0 -81
- package/docs/validation/release-audit-inventory.json +0 -1306
- package/docs/validation/tier-acceptance-report-v1.json +0 -2538
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"video-sequence.js","sourceRoot":"","sources":["../../src/motion/video-sequence.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Video frame sequences. Builds a deterministic sequence of frames from the \"video\" optical capture\n * state (frameRateHz) and a shutter angle.\n *\n * Each frame is an ordinary ResolvedReleaseFrame, so the production capture snapshot and\n * image-formation plan use it unchanged. An optional electronic rolling shutter gives every frame the\n * same line-by-line exposure offsets. Frame timing, seeds and schedules depend only on the inputs and\n * the absolute frame index. They never depend on how the sequence is split into chunks, or on\n * earlier frames.\n * @see docs/MOTION_AND_SIGNAL.md#video-frame-sequences for equations, conventions and limits.\n */\n\nimport { parseEvidenceList, type EvidenceProvenance } from \"../core/evidence-provenance.js\";\nimport { InvalidConfigurationError } from \"../core/configuration-error.js\";\nimport { rejectUnknownFields, requireInputObject, requirePublicOpaqueId, requireInputKeys } from \"../core/record-validation.js\";\nimport { InvalidScientificInputError } from \"../core/validation.js\";\nimport type { ReleaseAutomationState, ResolvedReleaseFrame } from \"../capture/release-sequence.js\";\nimport { parseFocusPlane, type FocusPlane } from \"../optics/focus-state.js\";\nimport { parseOpticalProfileState, type OpticalProfileState } from \"../optics/profile-contract.js\";\nimport {\n resolveElectronicRollingShutterExposureSchedule,\n ELECTRONIC_ROLLING_SHUTTER_MODEL,\n createRollingShutterCaptureExposureSchedule,\n type ElectronicRollingShutterExposureSchedule\n} from \"../sensor/readout-exposure-linkage.js\";\nimport type { RollingSensorReadoutTimingDeclaration } from \"../sensor/readout-timing.js\";\nimport { deriveNativeSiteStreamSeedUint32 } from \"../sensor/stochastic-seed.js\";\n\nexport const VIDEO_FRAME_SEQUENCE_VERSION = \"1.0.0\" as const;\n/** Stream identifier (\"VIDF\"). Keeps per-frame video seeds separate from per-site noise streams. */\nexport const VIDEO_FRAME_SEED_STREAM_ID = 0x56494446 as const;\n/** Maximum frames per call. Resolve longer clips in chunks using firstFrameIndex. */\nexport const VIDEO_FRAME_SEQUENCE_MAXIMUM_FRAMES = 100_000 as const;\n\nfunction requireFrameRate(frameRateHz: number): number {\n if (typeof frameRateHz !== \"number\" || !Number.isFinite(frameRateHz) || frameRateHz <= 0) {\n throw new InvalidScientificInputError(\"frameRateHz must be a finite number greater than zero.\");\n }\n return frameRateHz;\n}\n\nfunction requireShutterAngle(shutterAngleDegrees: number): number {\n if (typeof shutterAngleDegrees !== \"number\" || !Number.isFinite(shutterAngleDegrees) ||\n shutterAngleDegrees <= 0 || shutterAngleDegrees > 360) {\n throw new InvalidScientificInputError(\"shutterAngleDegrees must lie in (0, 360].\");\n }\n return shutterAngleDegrees;\n}\n\n/**\n * Exposure time for a shutter angle (as on a rotary film-camera shutter): t = (angle / 360) / frameRateHz.\n * A 180° angle exposes for half of each frame period.\n */\nexport function calculateShutterAngleExposureSeconds(frameRateHz: number, shutterAngleDegrees: number): number {\n return requireShutterAngle(shutterAngleDegrees) / 360 / requireFrameRate(frameRateHz);\n}\n\n/** Inverse of {@link calculateShutterAngleExposureSeconds}: angle = 360 · frameRateHz · t. */\nexport function calculateShutterAngleFromExposureSeconds(frameRateHz: number, exposureSeconds: number): number {\n if (typeof exposureSeconds !== \"number\" || !Number.isFinite(exposureSeconds) || exposureSeconds <= 0) {\n throw new InvalidScientificInputError(\"exposureSeconds must be a finite number greater than zero.\");\n }\n const angle = 360 * requireFrameRate(frameRateHz) * exposureSeconds;\n if (angle > 360 * (1 + 1e-12)) {\n throw new InvalidScientificInputError(\"Exposure longer than one frame period has no shutter angle.\");\n }\n return Math.min(360, angle);\n}\n\nexport interface ShutterAngleRuleAssessment {\n frameRateHz: number;\n shutterAngleDegrees: number;\n exposureSeconds: number;\n /** 1 / (2 · frameRateHz): the 180° convention. */\n conventionExposureSeconds: number;\n /** log2(exposure / convention): negative is shorter (crisper, more staccato) motion. */\n deviationStops: number;\n classification: \"matches-180-degree-convention\" | \"shorter-than-convention\" | \"longer-than-convention\";\n /** The 180° rule is a cinematographic convention for motion-blur appearance, not a physical law. */\n conventionNotPhysics: true;\n}\n\n/**\n * Compares a shutter angle with the 180° cinematographic convention (exposure = half the frame\n * period). Within a relative 1e-9 the angle \"matches\". Otherwise the signed deviation is reported.\n */\nexport function assessShutterAngleRule(frameRateHz: number, shutterAngleDegrees: number): ShutterAngleRuleAssessment {\n const exposureSeconds = calculateShutterAngleExposureSeconds(frameRateHz, shutterAngleDegrees);\n const conventionExposureSeconds = 1 / (2 * frameRateHz);\n const ratio = exposureSeconds / conventionExposureSeconds;\n return {\n frameRateHz, shutterAngleDegrees, exposureSeconds, conventionExposureSeconds,\n deviationStops: Math.log2(ratio),\n classification: Math.abs(ratio - 1) <= 1e-9 ? \"matches-180-degree-convention\"\n : ratio < 1 ? \"shorter-than-convention\" : \"longer-than-convention\",\n conventionNotPhysics: true\n };\n}\n\nexport interface ResolveVideoFrameSequenceInput {\n sequenceId: string;\n /** Exact optical capture state. captureMode must be \"video\", with a positive frameRateHz. */\n opticalState: OpticalProfileState;\n /** Shutter angle in (0, 360]; exposure = angle / 360 / frameRateHz. */\n shutterAngleDegrees: number;\n /** Absolute index of the first frame to resolve (default 0). */\n firstFrameIndex?: number;\n frameCount: number;\n sequenceSeedUint32: number;\n iso: number;\n /** Defaults to the optical state's finite focus distance. */\n focus?: FocusPlane;\n automation: { ae: ReleaseAutomationState; af: ReleaseAutomationState; awb: ReleaseAutomationState };\n whiteBalanceStateId?: string;\n /** Evidence for the commanded frame rate and shutter-angle timing. Used for the exposure fact. */\n timingEvidence: readonly EvidenceProvenance[];\n /** Optional electronic rolling shutter applied identically to every frame. */\n rollingShutter?: {\n readout: RollingSensorReadoutTimingDeclaration;\n linkageEvidence: readonly EvidenceProvenance[];\n };\n}\n\nexport interface VideoFrameSequence {\n version: typeof VIDEO_FRAME_SEQUENCE_VERSION;\n sequenceId: string;\n frameRateHz: number;\n framePeriodSeconds: number;\n shutterAngleDegrees: number;\n exposureSeconds: number;\n shutterAngleRule: ShutterAngleRuleAssessment;\n firstFrameIndex: number;\n frameCount: number;\n sequenceSeedUint32: number;\n seedDerivation: \"murmur3-x86-32(sequenceSeed, absoluteFrameIndex, VIDEO_FRAME_SEED_STREAM_ID)\";\n frameTimeDerivation: \"absoluteFrameIndex / frameRateHz\";\n /**\n * Exposure schedule for each frame. It is the same for every frame; times are relative to each\n * frame's own first-opening phase. Null when no rolling shutter is declared; the caller then\n * supplies the global schedule of its capture mode.\n */\n exposureSchedule: ReturnType<typeof createRollingShutterCaptureExposureSchedule> | null;\n rollingShutter: Pick<ElectronicRollingShutterExposureSchedule, \"modelId\" | \"modelVersion\" | \"lineScanSkewSeconds\" | \"linkage\"> | null;\n /** Ordinary release frames: pass each to createProductionCaptureSnapshotFromReleaseFrame. */\n frames: readonly ResolvedReleaseFrame[];\n limitations: readonly string[];\n}\n\n/**\n * Resolves `frameCount` consecutive video frames starting at `firstFrameIndex`.\n *\n * Frame k (absolute index) opens k / frameRateHz seconds after the sequence starts, and exposes for\n * (angle / 360) / frameRateHz. Its random seed is a MurmurHash3 of (sequence seed, k, stream id).\n *\n * Every value depends only on the inputs and k. So resolving frames 0–99 at once, or as 0–49 then\n * 50–99, gives identical frames.\n *\n * With a rolling shutter, the line at normalized scan position s in frame k integrates over\n * [k/f + s·τ, k/f + s·τ + T]. τ must not exceed the frame period, so each line is read once per\n * frame.\n */\nexport function resolveVideoFrameSequence(input: ResolveVideoFrameSequenceInput): VideoFrameSequence {\n requireInputKeys(input, \"resolveVideoFrameSequence\", [\"sequenceId\", \"opticalState\", \"shutterAngleDegrees\", \"firstFrameIndex\", \"frameCount\", \"sequenceSeedUint32\", \"iso\", \"focus\", \"automation\", \"whiteBalanceStateId\", \"timingEvidence\", \"rollingShutter\"]);\n requireInputObject(input.automation, \"resolveVideoFrameSequence automation\");\n rejectUnknownFields(input.automation, [\"ae\", \"af\", \"awb\"], \"resolveVideoFrameSequence automation\");\n if (input.rollingShutter !== undefined) {\n requireInputObject(input.rollingShutter, \"resolveVideoFrameSequence rollingShutter\");\n rejectUnknownFields(input.rollingShutter, [\"readout\", \"linkageEvidence\"], \"resolveVideoFrameSequence rollingShutter\");\n }\n const sequenceId = requirePublicOpaqueId(input.sequenceId, \"Invalid video sequence ID.\");\n const optical = parseOpticalProfileState(input.opticalState);\n if (optical.captureMode !== \"video\") {\n throw new InvalidConfigurationError(\"Video frame sequences require an optical state with captureMode \\\"video\\\".\");\n }\n const frameRateHz = optical.frameRateHz;\n const shutterAngleDegrees = requireShutterAngle(input.shutterAngleDegrees);\n const exposureSeconds = calculateShutterAngleExposureSeconds(frameRateHz, shutterAngleDegrees);\n const first = input.firstFrameIndex ?? 0;\n if (!Number.isSafeInteger(first) || first < 0 || !Number.isSafeInteger(input.frameCount) || input.frameCount < 1 ||\n input.frameCount > VIDEO_FRAME_SEQUENCE_MAXIMUM_FRAMES || first + input.frameCount - 1 > 0xffffffff) {\n throw new InvalidScientificInputError(\"Video frames need a non-negative first index, 1–100000 frames and uint32 frame indices.\");\n }\n const seed = input.sequenceSeedUint32;\n if (!Number.isInteger(seed) || seed < 0 || seed > 0xffffffff) {\n throw new InvalidScientificInputError(\"sequenceSeedUint32 must be a uint32 integer.\");\n }\n if (typeof input.iso !== \"number\" || !Number.isFinite(input.iso) || input.iso <= 0) {\n throw new InvalidScientificInputError(\"iso must be a finite number greater than zero.\");\n }\n const timingEvidence = parseEvidenceList(input.timingEvidence, \"video.timingEvidence\");\n const focus = parseFocusPlane(input.focus ?? { kind: \"finite\", distanceM: optical.focusDistanceM });\n const automation = { ae: input.automation.ae, af: input.automation.af, awb: input.automation.awb };\n for (const state of Object.values(automation)) {\n if (state !== \"manual\" && state !== \"locked\" && state !== \"continuous\") {\n throw new InvalidConfigurationError(\"Video automation states must be manual, locked or continuous.\");\n }\n }\n const whiteBalanceStateId = input.whiteBalanceStateId === undefined ? undefined\n : requirePublicOpaqueId(input.whiteBalanceStateId, \"Invalid white-balance state ID.\");\n const framePeriodSeconds = 1 / frameRateHz;\n\n let rolling: ElectronicRollingShutterExposureSchedule | null = null;\n if (input.rollingShutter !== undefined) {\n rolling = resolveElectronicRollingShutterExposureSchedule({ readout: input.rollingShutter.readout,\n nominalExposureDurationSeconds: { value: exposureSeconds, unit: \"s\", evidence: timingEvidence },\n linkageEvidence: input.rollingShutter.linkageEvidence });\n if (rolling.lineScanSkewSeconds > framePeriodSeconds) {\n throw new InvalidScientificInputError(\"Rolling-shutter line skew exceeds the video frame period; lines cannot be read once per frame.\");\n }\n }\n\n const start = (index: number): number => index / frameRateHz;\n const frames: ResolvedReleaseFrame[] = Array.from({ length: input.frameCount }, (_, offset) => {\n const frameIndex = first + offset, exposureStartTimeSeconds = start(frameIndex);\n return {\n sequenceId,\n frameIndex,\n releaseFrameId: sequenceId + \":video:\" + frameIndex,\n exposureStartTimeSeconds,\n exposureEndTimeSeconds: exposureStartTimeSeconds + exposureSeconds,\n sceneTimeSecondsFromSequenceStart: exposureStartTimeSeconds,\n startIntervalFromPreviousSeconds: frameIndex === 0 ? null : exposureStartTimeSeconds - start(frameIndex - 1),\n timingConstraints: [\"requested-cadence\"],\n stochasticSeedUint32: deriveNativeSiteStreamSeedUint32(seed, frameIndex, VIDEO_FRAME_SEED_STREAM_ID),\n exposure: { aperture: optical.aperture, shutterSeconds: exposureSeconds, iso: input.iso },\n focus: { ...focus },\n automation: { ...automation },\n ...(whiteBalanceStateId === undefined ? {} : { whiteBalanceStateId })\n };\n });\n\n return {\n version: VIDEO_FRAME_SEQUENCE_VERSION,\n sequenceId,\n frameRateHz,\n framePeriodSeconds,\n shutterAngleDegrees,\n exposureSeconds,\n shutterAngleRule: assessShutterAngleRule(frameRateHz, shutterAngleDegrees),\n firstFrameIndex: first,\n frameCount: input.frameCount,\n sequenceSeedUint32: seed,\n seedDerivation: \"murmur3-x86-32(sequenceSeed, absoluteFrameIndex, VIDEO_FRAME_SEED_STREAM_ID)\",\n frameTimeDerivation: \"absoluteFrameIndex / frameRateHz\",\n exposureSchedule: rolling === null ? null : createRollingShutterCaptureExposureSchedule(rolling),\n rollingShutter: rolling === null ? null : { modelId: ELECTRONIC_ROLLING_SHUTTER_MODEL.id,\n modelVersion: ELECTRONIC_ROLLING_SHUTTER_MODEL.version, lineScanSkewSeconds: rolling.lineScanSkewSeconds,\n linkage: rolling.linkage },\n frames,\n limitations: [\n \"Frame timing is ideal: no frame-rate drift, dropped frames, variable frame rate or sensor-mode switching.\",\n \"Exposure follows the shutter-angle relation t = angle/360/f; automatic exposure between frames is not modeled.\",\n \"The 180-degree rule is reported as a cinematographic convention, not a physical requirement.\",\n \"Video encoding, compression, temporal noise reduction and frame interpolation are not modeled.\"\n ]\n };\n}\n"]}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* blooming.
|
|
7
|
-
* @see docs/PHYSICS_FOUNDATION.md for equations, coordinate
|
|
8
|
-
* limits.
|
|
2
|
+
* Geometry of an ideal regular-polygon aperture, and the directions of the diffraction rays (the
|
|
3
|
+
* "sunstar" spikes) its straight edges produce.
|
|
4
|
+
*
|
|
5
|
+
* This models only geometry and symmetry. It does not calculate diffraction intensity,
|
|
6
|
+
* wavelength-dependent star length, blade curvature, lens aberrations, coatings or sensor blooming.
|
|
7
|
+
* @see docs/PHYSICS_FOUNDATION.md for the equations, units, coordinate conventions, known blockers
|
|
8
|
+
* and support limits.
|
|
9
9
|
*/
|
|
10
10
|
import { type CalculationResult } from "../core/calculation-result.js";
|
|
11
11
|
export interface CalculateIdealApertureInput {
|
|
@@ -28,21 +28,20 @@ export interface IdealApertureGeometry {
|
|
|
28
28
|
/**
|
|
29
29
|
* Diffraction-ray directions in degrees, normalized to [0, 360).
|
|
30
30
|
*
|
|
31
|
-
* Each ray is perpendicular to a blade edge.
|
|
32
|
-
*
|
|
33
|
-
* visible ray directions.
|
|
31
|
+
* Each ray is perpendicular to a blade edge. With an even blade count,
|
|
32
|
+
* opposite edges are parallel and their rays overlap. An odd blade count
|
|
33
|
+
* therefore gives twice as many visible ray directions.
|
|
34
34
|
*/
|
|
35
35
|
sunstarRayAnglesDegrees: readonly number[];
|
|
36
36
|
/** Unit-circumradius regular-polygon vertices. */
|
|
37
37
|
normalizedVertices: readonly ApertureVertex[];
|
|
38
38
|
}
|
|
39
39
|
/**
|
|
40
|
-
* Calculates ideal regular-polygon aperture geometry and the
|
|
41
|
-
*
|
|
40
|
+
* Calculates ideal regular-polygon aperture geometry and the directions of
|
|
41
|
+
* the diffraction rays from its straight edges.
|
|
42
42
|
*
|
|
43
|
-
* This models only geometry
|
|
43
|
+
* This models only geometry and symmetry. It does not calculate diffraction
|
|
44
44
|
* intensity, wavelength-dependent star length, blade curvature, lens
|
|
45
|
-
* aberrations, coatings
|
|
45
|
+
* aberrations, coatings or sensor blooming.
|
|
46
46
|
*/
|
|
47
47
|
export declare function calculateIdealApertureGeometry(input: CalculateIdealApertureInput): CalculationResult<IdealApertureGeometry>;
|
|
48
|
-
//# sourceMappingURL=aperture.d.ts.map
|
package/dist/optics/aperture.js
CHANGED
|
@@ -1,29 +1,31 @@
|
|
|
1
1
|
// SPDX-License-Identifier: Apache-2.0
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* blooming.
|
|
8
|
-
* @see docs/PHYSICS_FOUNDATION.md for equations, coordinate
|
|
9
|
-
* limits.
|
|
3
|
+
* Geometry of an ideal regular-polygon aperture, and the directions of the diffraction rays (the
|
|
4
|
+
* "sunstar" spikes) its straight edges produce.
|
|
5
|
+
*
|
|
6
|
+
* This models only geometry and symmetry. It does not calculate diffraction intensity,
|
|
7
|
+
* wavelength-dependent star length, blade curvature, lens aberrations, coatings or sensor blooming.
|
|
8
|
+
* @see docs/PHYSICS_FOUNDATION.md for the equations, units, coordinate conventions, known blockers
|
|
9
|
+
* and support limits.
|
|
10
10
|
*/
|
|
11
11
|
import { calculatedResult } from "../core/calculation-result.js";
|
|
12
12
|
import { InvalidScientificInputError, requirePositiveInteger } from "../core/validation.js";
|
|
13
|
+
import { requireInputKeys } from "../core/record-validation.js";
|
|
13
14
|
const MAX_IDEAL_APERTURE_BLADES = 1024;
|
|
14
15
|
function normalizeDegrees(value) {
|
|
15
16
|
const normalized = value % 360;
|
|
16
17
|
return normalized < 0 ? normalized + 360 : normalized;
|
|
17
18
|
}
|
|
18
19
|
/**
|
|
19
|
-
* Calculates ideal regular-polygon aperture geometry and the
|
|
20
|
-
*
|
|
20
|
+
* Calculates ideal regular-polygon aperture geometry and the directions of
|
|
21
|
+
* the diffraction rays from its straight edges.
|
|
21
22
|
*
|
|
22
|
-
* This models only geometry
|
|
23
|
+
* This models only geometry and symmetry. It does not calculate diffraction
|
|
23
24
|
* intensity, wavelength-dependent star length, blade curvature, lens
|
|
24
|
-
* aberrations, coatings
|
|
25
|
+
* aberrations, coatings or sensor blooming.
|
|
25
26
|
*/
|
|
26
27
|
export function calculateIdealApertureGeometry(input) {
|
|
28
|
+
requireInputKeys(input, "calculateIdealApertureGeometry", ["bladeCount", "firstBladeEdgeAngleDegrees"]);
|
|
27
29
|
requirePositiveInteger("bladeCount", input.bladeCount);
|
|
28
30
|
if (input.bladeCount < 3) {
|
|
29
31
|
throw new InvalidScientificInputError("bladeCount must be greater than or equal to 3.");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aperture.js","sourceRoot":"","sources":["../../src/optics/aperture.ts"],"names":[],"mappings":"AAAA,sCAAsC;AAEtC;;;;;;;;GAQG;AAEH,OAAO,EACL,gBAAgB,EAEjB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,2BAA2B,EAC3B,sBAAsB,EACvB,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"aperture.js","sourceRoot":"","sources":["../../src/optics/aperture.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Geometry of an ideal regular-polygon aperture, and the directions of the diffraction rays (the\n * \"sunstar\" spikes) its straight edges produce.\n *\n * This models only geometry and symmetry. It does not calculate diffraction intensity,\n * wavelength-dependent star length, blade curvature, lens aberrations, coatings or sensor blooming.\n * @see docs/PHYSICS_FOUNDATION.md for the equations, units, coordinate conventions, known blockers\n * and support limits.\n */\n\nimport {\n calculatedResult,\n type CalculationResult\n} from \"../core/calculation-result.js\";\nimport {\n InvalidScientificInputError,\n requirePositiveInteger\n} from \"../core/validation.js\";\nimport { requireInputKeys } from \"../core/record-validation.js\";\n\nconst MAX_IDEAL_APERTURE_BLADES = 1024;\n\nexport interface CalculateIdealApertureInput {\n /** Number of straight diaphragm blades/sides. Must be from 3 through 1024. */\n bladeCount: number;\n /**\n * Rotation of the first blade edge in degrees, measured counter-clockwise\n * in image coordinates before the diffraction-normal offset is applied.\n */\n firstBladeEdgeAngleDegrees?: number;\n}\n\nexport interface ApertureVertex {\n x: number;\n y: number;\n}\n\nexport interface IdealApertureGeometry {\n bladeCount: number;\n /** Number of diffraction ray directions for the ideal straight-edged polygon. */\n sunstarRayCount: number;\n /**\n * Diffraction-ray directions in degrees, normalized to [0, 360).\n *\n * Each ray is perpendicular to a blade edge. With an even blade count,\n * opposite edges are parallel and their rays overlap. An odd blade count\n * therefore gives twice as many visible ray directions.\n */\n sunstarRayAnglesDegrees: readonly number[];\n /** Unit-circumradius regular-polygon vertices. */\n normalizedVertices: readonly ApertureVertex[];\n}\n\nfunction normalizeDegrees(value: number): number {\n const normalized = value % 360;\n return normalized < 0 ? normalized + 360 : normalized;\n}\n\n/**\n * Calculates ideal regular-polygon aperture geometry and the directions of\n * the diffraction rays from its straight edges.\n *\n * This models only geometry and symmetry. It does not calculate diffraction\n * intensity, wavelength-dependent star length, blade curvature, lens\n * aberrations, coatings or sensor blooming.\n */\nexport function calculateIdealApertureGeometry(\n input: CalculateIdealApertureInput\n): CalculationResult<IdealApertureGeometry> {\n requireInputKeys(input, \"calculateIdealApertureGeometry\", [\"bladeCount\", \"firstBladeEdgeAngleDegrees\"]);\n requirePositiveInteger(\"bladeCount\", input.bladeCount);\n if (input.bladeCount < 3) {\n throw new InvalidScientificInputError(\n \"bladeCount must be greater than or equal to 3.\"\n );\n }\n if (input.bladeCount > MAX_IDEAL_APERTURE_BLADES) {\n throw new InvalidScientificInputError(\n `bladeCount must be less than or equal to ${MAX_IDEAL_APERTURE_BLADES}.`\n );\n }\n\n const rawFirstBladeEdgeAngleDegrees =\n input.firstBladeEdgeAngleDegrees ?? 0;\n if (!Number.isFinite(rawFirstBladeEdgeAngleDegrees)) {\n throw new InvalidScientificInputError(\n \"firstBladeEdgeAngleDegrees must be finite.\"\n );\n }\n const firstBladeEdgeAngleDegrees = normalizeDegrees(\n rawFirstBladeEdgeAngleDegrees\n );\n\n const edgeStepDegrees = 360 / input.bladeCount;\n\n const rayAngles: number[] = [];\n for (let index = 0; index < input.bladeCount; index += 1) {\n const bladeEdgeAngle =\n firstBladeEdgeAngleDegrees + index * edgeStepDegrees;\n const rayAngle = normalizeDegrees(bladeEdgeAngle + 90);\n rayAngles.push(rayAngle);\n\n if (input.bladeCount % 2 !== 0) {\n rayAngles.push(normalizeDegrees(rayAngle + 180));\n }\n }\n\n rayAngles.sort((left, right) => left - right);\n\n const vertexRotationRadians =\n ((firstBladeEdgeAngleDegrees - 90 + edgeStepDegrees / 2) * Math.PI) / 180;\n const vertices = Array.from({ length: input.bladeCount }, (_, index) => {\n const angle =\n vertexRotationRadians + (index * 2 * Math.PI) / input.bladeCount;\n return {\n x: Math.cos(angle),\n y: Math.sin(angle)\n };\n });\n\n return calculatedResult(\n {\n bladeCount: input.bladeCount,\n sunstarRayCount: rayAngles.length,\n sunstarRayAnglesDegrees: rayAngles,\n normalizedVertices: vertices\n },\n \"ideal-regular-polygon-aperture\",\n \"1.0.0\",\n [\n \"Aperture opening is a regular polygon with straight edges\",\n \"Each diffraction ray is perpendicular to a blade edge\",\n \"Opposing parallel-edge diffraction overlaps for even blade counts\",\n \"Ray intensity/length and blade curvature are not modeled\",\n \"Blade count is computationally bounded to 1024\"\n ]\n );\n}\n"]}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Atmospheric haze as a scene-radiance modifier along a horizontal, homogeneous line of sight
|
|
3
|
+
* (Koschmieder 1924, Beitr. Phys. freien Atmos. 12:33; Middleton, Vision Through the Atmosphere,
|
|
4
|
+
* 1952; McCartney, Optics of the Atmosphere, 1976, ch. 1):
|
|
5
|
+
* L(d, lambda) = L0(lambda) t + L_air(lambda) (1 - t), t = exp(-beta(lambda) d)
|
|
6
|
+
* with extinction coefficient beta = beta_Rayleigh + beta_aerosol:
|
|
7
|
+
* beta_Rayleigh(lambda) = beta_R,ref (lambda / lambda_ref)^(-rayleighExponent) (Rayleigh: 4;
|
|
8
|
+
* Bucholtz 1995, Appl. Opt. 34:2765, gives about 4.0-4.1 for air in the visible),
|
|
9
|
+
* beta_aerosol(lambda) = beta_A,ref (lambda / lambda_ref)^(-alpha) (Angstrom 1929, Geogr. Ann.
|
|
10
|
+
* 11:156; alpha typically about 0-2.5).
|
|
11
|
+
* L_air is the caller-supplied horizon (airlight) radiance at the same wavelength.
|
|
12
|
+
*
|
|
13
|
+
* This is an approximation. It assumes a uniform atmosphere and a single line of sight. It ignores
|
|
14
|
+
* the angular structure of multiple scattering and any gradient in sky luminance. The caller
|
|
15
|
+
* supplies the reference extinction values; none are built in.
|
|
16
|
+
*
|
|
17
|
+
* Meteorological visibility: Koschmieder's relation V = -ln(epsilon) / beta for a black target at
|
|
18
|
+
* contrast threshold epsilon (0.02 gives 3.912 / beta; the WMO meteorological optical range uses
|
|
19
|
+
* 0.05, about 3.0 / beta; WMO-No. 8, 2018, vol. I ch. 9).
|
|
20
|
+
* @see docs/PHYSICS_FOUNDATION.md for the equations, units, coordinate conventions, known blockers
|
|
21
|
+
* and support limits.
|
|
22
|
+
*/
|
|
23
|
+
import { type CalculationResult } from "../core/calculation-result.js";
|
|
24
|
+
export interface AtmosphericExtinctionModel {
|
|
25
|
+
/** Wavelength at which the reference coefficients apply, nm. */
|
|
26
|
+
referenceWavelengthNm: number;
|
|
27
|
+
/** Molecular (Rayleigh) extinction coefficient at the reference wavelength, 1/m (>= 0). */
|
|
28
|
+
rayleighExtinctionPerMeter: number;
|
|
29
|
+
/** Aerosol extinction coefficient at the reference wavelength, 1/m (>= 0). */
|
|
30
|
+
aerosolExtinctionPerMeter: number;
|
|
31
|
+
/** Angstrom exponent alpha for the aerosol term (finite, typically 0-2.5). */
|
|
32
|
+
angstromExponent: number;
|
|
33
|
+
/** Rayleigh wavelength exponent; defaults to 4. */
|
|
34
|
+
rayleighExponent?: number;
|
|
35
|
+
}
|
|
36
|
+
export interface CalculateAtmosphericHazeInput {
|
|
37
|
+
/** Line-of-sight distance through the homogeneous haze, metres (>= 0). */
|
|
38
|
+
pathLengthM: number;
|
|
39
|
+
/** Wavelength, nm (same basis as the extinction data). */
|
|
40
|
+
wavelengthNm: number;
|
|
41
|
+
/** Scene (object) radiance at zero distance, any linear radiance unit (>= 0). */
|
|
42
|
+
sceneRadiance: number;
|
|
43
|
+
/** Horizon/airlight radiance in the same unit (>= 0). */
|
|
44
|
+
airlightRadiance: number;
|
|
45
|
+
extinction: AtmosphericExtinctionModel;
|
|
46
|
+
}
|
|
47
|
+
export interface AtmosphericHaze {
|
|
48
|
+
wavelengthNm: number;
|
|
49
|
+
pathLengthM: number;
|
|
50
|
+
rayleighExtinctionPerMeter: number;
|
|
51
|
+
aerosolExtinctionPerMeter: number;
|
|
52
|
+
extinctionPerMeter: number;
|
|
53
|
+
opticalDepth: number;
|
|
54
|
+
/** Direct transmittance t = exp(-beta d). */
|
|
55
|
+
transmittance: number;
|
|
56
|
+
/** L0 t. */
|
|
57
|
+
attenuatedSceneRadiance: number;
|
|
58
|
+
/** L_air (1 - t). */
|
|
59
|
+
airlightContribution: number;
|
|
60
|
+
/** L0 t + L_air (1 - t), in the input radiance unit. */
|
|
61
|
+
hazedRadiance: number;
|
|
62
|
+
/** Apparent contrast against the horizon divided by the intrinsic contrast: (L - L_air)/(L0 - L_air) = t. */
|
|
63
|
+
contrastTransmittance: number;
|
|
64
|
+
}
|
|
65
|
+
export interface CalculateExtinctionFromVisibilityInput {
|
|
66
|
+
/** Meteorological visibility, metres. */
|
|
67
|
+
visibilityM: number;
|
|
68
|
+
/** Contrast threshold epsilon in (0, 1); Koschmieder 0.02 by default, WMO MOR uses 0.05. */
|
|
69
|
+
contrastThreshold?: number;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Koschmieder haze at one wavelength: attenuated scene radiance plus airlight, with Rayleigh and
|
|
73
|
+
* Angstrom-law aerosol extinction.
|
|
74
|
+
*/
|
|
75
|
+
export declare function calculateAtmosphericHaze(input: CalculateAtmosphericHazeInput): CalculationResult<AtmosphericHaze>;
|
|
76
|
+
/**
|
|
77
|
+
* Extinction coefficient from meteorological visibility with Koschmieder's relation
|
|
78
|
+
* beta = -ln(epsilon) / V.
|
|
79
|
+
*/
|
|
80
|
+
export declare function calculateExtinctionFromVisibility(input: CalculateExtinctionFromVisibilityInput): CalculationResult<{
|
|
81
|
+
extinctionPerMeter: number;
|
|
82
|
+
contrastThreshold: number;
|
|
83
|
+
}>;
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
/**
|
|
3
|
+
* Atmospheric haze as a scene-radiance modifier along a horizontal, homogeneous line of sight
|
|
4
|
+
* (Koschmieder 1924, Beitr. Phys. freien Atmos. 12:33; Middleton, Vision Through the Atmosphere,
|
|
5
|
+
* 1952; McCartney, Optics of the Atmosphere, 1976, ch. 1):
|
|
6
|
+
* L(d, lambda) = L0(lambda) t + L_air(lambda) (1 - t), t = exp(-beta(lambda) d)
|
|
7
|
+
* with extinction coefficient beta = beta_Rayleigh + beta_aerosol:
|
|
8
|
+
* beta_Rayleigh(lambda) = beta_R,ref (lambda / lambda_ref)^(-rayleighExponent) (Rayleigh: 4;
|
|
9
|
+
* Bucholtz 1995, Appl. Opt. 34:2765, gives about 4.0-4.1 for air in the visible),
|
|
10
|
+
* beta_aerosol(lambda) = beta_A,ref (lambda / lambda_ref)^(-alpha) (Angstrom 1929, Geogr. Ann.
|
|
11
|
+
* 11:156; alpha typically about 0-2.5).
|
|
12
|
+
* L_air is the caller-supplied horizon (airlight) radiance at the same wavelength.
|
|
13
|
+
*
|
|
14
|
+
* This is an approximation. It assumes a uniform atmosphere and a single line of sight. It ignores
|
|
15
|
+
* the angular structure of multiple scattering and any gradient in sky luminance. The caller
|
|
16
|
+
* supplies the reference extinction values; none are built in.
|
|
17
|
+
*
|
|
18
|
+
* Meteorological visibility: Koschmieder's relation V = -ln(epsilon) / beta for a black target at
|
|
19
|
+
* contrast threshold epsilon (0.02 gives 3.912 / beta; the WMO meteorological optical range uses
|
|
20
|
+
* 0.05, about 3.0 / beta; WMO-No. 8, 2018, vol. I ch. 9).
|
|
21
|
+
* @see docs/PHYSICS_FOUNDATION.md for the equations, units, coordinate conventions, known blockers
|
|
22
|
+
* and support limits.
|
|
23
|
+
*/
|
|
24
|
+
import { approximationResult, calculatedResult } from "../core/calculation-result.js";
|
|
25
|
+
import { InvalidScientificInputError, requirePositiveFinite } from "../core/validation.js";
|
|
26
|
+
import { rejectUnknownFields, requireInputKeys } from "../core/record-validation.js";
|
|
27
|
+
import { InvalidConfigurationError } from "../core/configuration-error.js";
|
|
28
|
+
function requireNonNegativeFinite(name, value) {
|
|
29
|
+
if (typeof value !== "number" || !Number.isFinite(value) || value < 0) {
|
|
30
|
+
throw new InvalidScientificInputError(`${name} must be finite and non-negative.`);
|
|
31
|
+
}
|
|
32
|
+
return value;
|
|
33
|
+
}
|
|
34
|
+
function requireFinite(name, value) {
|
|
35
|
+
if (typeof value !== "number" || !Number.isFinite(value)) {
|
|
36
|
+
throw new InvalidScientificInputError(`${name} must be finite.`);
|
|
37
|
+
}
|
|
38
|
+
return value;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Koschmieder haze at one wavelength: attenuated scene radiance plus airlight, with Rayleigh and
|
|
42
|
+
* Angstrom-law aerosol extinction.
|
|
43
|
+
*/
|
|
44
|
+
export function calculateAtmosphericHaze(input) {
|
|
45
|
+
requireInputKeys(input, "calculateAtmosphericHaze", ["pathLengthM", "wavelengthNm", "sceneRadiance", "airlightRadiance", "extinction"]);
|
|
46
|
+
const d = requireNonNegativeFinite("pathLengthM", input.pathLengthM);
|
|
47
|
+
requirePositiveFinite("wavelengthNm", input.wavelengthNm);
|
|
48
|
+
const l0 = requireNonNegativeFinite("sceneRadiance", input.sceneRadiance);
|
|
49
|
+
const lAir = requireNonNegativeFinite("airlightRadiance", input.airlightRadiance);
|
|
50
|
+
const model = input.extinction;
|
|
51
|
+
if (typeof model !== "object" || model === null) {
|
|
52
|
+
throw new InvalidConfigurationError("extinction must be an object.");
|
|
53
|
+
}
|
|
54
|
+
// A misspelt optional field (for example rayleighExponet) must not silently fall back to the default.
|
|
55
|
+
rejectUnknownFields(model, ["referenceWavelengthNm", "rayleighExtinctionPerMeter", "aerosolExtinctionPerMeter", "angstromExponent", "rayleighExponent"], "extinction");
|
|
56
|
+
requirePositiveFinite("extinction.referenceWavelengthNm", model.referenceWavelengthNm);
|
|
57
|
+
const betaR = requireNonNegativeFinite("extinction.rayleighExtinctionPerMeter", model.rayleighExtinctionPerMeter);
|
|
58
|
+
const betaA = requireNonNegativeFinite("extinction.aerosolExtinctionPerMeter", model.aerosolExtinctionPerMeter);
|
|
59
|
+
const alpha = requireFinite("extinction.angstromExponent", model.angstromExponent);
|
|
60
|
+
const rayleighExponent = model.rayleighExponent === undefined
|
|
61
|
+
? 4
|
|
62
|
+
: requireFinite("extinction.rayleighExponent", model.rayleighExponent);
|
|
63
|
+
if (alpha < -1 || alpha > 4 || rayleighExponent < 3.5 || rayleighExponent > 4.5) {
|
|
64
|
+
throw new InvalidScientificInputError("extinction.angstromExponent must lie in [-1, 4] and rayleighExponent in [3.5, 4.5].");
|
|
65
|
+
}
|
|
66
|
+
const ratio = input.wavelengthNm / model.referenceWavelengthNm;
|
|
67
|
+
const rayleigh = betaR * ratio ** -rayleighExponent;
|
|
68
|
+
const aerosol = betaA * ratio ** -alpha;
|
|
69
|
+
const beta = rayleigh + aerosol;
|
|
70
|
+
const opticalDepth = beta * d;
|
|
71
|
+
const transmittance = Math.exp(-opticalDepth);
|
|
72
|
+
const attenuated = l0 * transmittance;
|
|
73
|
+
// -expm1(-tau) = 1 - t without cancellation for thin haze.
|
|
74
|
+
const airlight = lAir * -Math.expm1(-opticalDepth);
|
|
75
|
+
return approximationResult({
|
|
76
|
+
wavelengthNm: input.wavelengthNm,
|
|
77
|
+
pathLengthM: d,
|
|
78
|
+
rayleighExtinctionPerMeter: rayleigh,
|
|
79
|
+
aerosolExtinctionPerMeter: aerosol,
|
|
80
|
+
extinctionPerMeter: beta,
|
|
81
|
+
opticalDepth,
|
|
82
|
+
transmittance,
|
|
83
|
+
attenuatedSceneRadiance: attenuated,
|
|
84
|
+
airlightContribution: airlight,
|
|
85
|
+
hazedRadiance: attenuated + airlight,
|
|
86
|
+
contrastTransmittance: transmittance
|
|
87
|
+
}, "koschmieder-homogeneous-haze", "1.0.0", [
|
|
88
|
+
"Koschmieder model: L = L0 exp(-beta d) + L_air (1 - exp(-beta d)) along one homogeneous horizontal line of sight",
|
|
89
|
+
`Extinction = Rayleigh (lambda^-${rayleighExponent}) + aerosol Angstrom law (lambda^-${alpha}) scaled from caller reference coefficients`,
|
|
90
|
+
"Airlight radiance is caller-supplied; sky gradients, multiple-scattering angular structure, absorption bands and slant-path density changes are not modeled",
|
|
91
|
+
"Radiance unit is whatever the caller supplies; the model is linear in it"
|
|
92
|
+
]);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Extinction coefficient from meteorological visibility with Koschmieder's relation
|
|
96
|
+
* beta = -ln(epsilon) / V.
|
|
97
|
+
*/
|
|
98
|
+
export function calculateExtinctionFromVisibility(input) {
|
|
99
|
+
requireInputKeys(input, "calculateExtinctionFromVisibility", ["visibilityM", "contrastThreshold"]);
|
|
100
|
+
requirePositiveFinite("visibilityM", input.visibilityM);
|
|
101
|
+
const epsilon = input.contrastThreshold ?? 0.02;
|
|
102
|
+
if (typeof epsilon !== "number" || !(epsilon > 0) || !(epsilon < 1)) {
|
|
103
|
+
throw new InvalidScientificInputError("contrastThreshold must lie in (0, 1).");
|
|
104
|
+
}
|
|
105
|
+
return calculatedResult({
|
|
106
|
+
extinctionPerMeter: -Math.log(epsilon) / input.visibilityM,
|
|
107
|
+
contrastThreshold: epsilon
|
|
108
|
+
}, "koschmieder-visibility-extinction", "1.0.0", [
|
|
109
|
+
"Koschmieder relation for a black target against the horizon in a homogeneous atmosphere",
|
|
110
|
+
"Threshold 0.02 is Koschmieder's; WMO meteorological optical range uses 0.05"
|
|
111
|
+
]);
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=atmospheric-haze.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"atmospheric-haze.js","sourceRoot":"","sources":["../../src/optics/atmospheric-haze.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Atmospheric haze as a scene-radiance modifier along a horizontal, homogeneous line of sight\n * (Koschmieder 1924, Beitr. Phys. freien Atmos. 12:33; Middleton, Vision Through the Atmosphere,\n * 1952; McCartney, Optics of the Atmosphere, 1976, ch. 1):\n * L(d, lambda) = L0(lambda) t + L_air(lambda) (1 - t), t = exp(-beta(lambda) d)\n * with extinction coefficient beta = beta_Rayleigh + beta_aerosol:\n * beta_Rayleigh(lambda) = beta_R,ref (lambda / lambda_ref)^(-rayleighExponent) (Rayleigh: 4;\n * Bucholtz 1995, Appl. Opt. 34:2765, gives about 4.0-4.1 for air in the visible),\n * beta_aerosol(lambda) = beta_A,ref (lambda / lambda_ref)^(-alpha) (Angstrom 1929, Geogr. Ann.\n * 11:156; alpha typically about 0-2.5).\n * L_air is the caller-supplied horizon (airlight) radiance at the same wavelength.\n *\n * This is an approximation. It assumes a uniform atmosphere and a single line of sight. It ignores\n * the angular structure of multiple scattering and any gradient in sky luminance. The caller\n * supplies the reference extinction values; none are built in.\n *\n * Meteorological visibility: Koschmieder's relation V = -ln(epsilon) / beta for a black target at\n * contrast threshold epsilon (0.02 gives 3.912 / beta; the WMO meteorological optical range uses\n * 0.05, about 3.0 / beta; WMO-No. 8, 2018, vol. I ch. 9).\n * @see docs/PHYSICS_FOUNDATION.md for the equations, units, coordinate conventions, known blockers\n * and support limits.\n */\n\nimport {\n approximationResult,\n calculatedResult,\n type CalculationResult\n} from \"../core/calculation-result.js\";\nimport {\n InvalidScientificInputError,\n requirePositiveFinite\n} from \"../core/validation.js\";\nimport { rejectUnknownFields, requireInputKeys } from \"../core/record-validation.js\";\nimport { InvalidConfigurationError } from \"../core/configuration-error.js\";\n\nexport interface AtmosphericExtinctionModel {\n /** Wavelength at which the reference coefficients apply, nm. */\n referenceWavelengthNm: number;\n /** Molecular (Rayleigh) extinction coefficient at the reference wavelength, 1/m (>= 0). */\n rayleighExtinctionPerMeter: number;\n /** Aerosol extinction coefficient at the reference wavelength, 1/m (>= 0). */\n aerosolExtinctionPerMeter: number;\n /** Angstrom exponent alpha for the aerosol term (finite, typically 0-2.5). */\n angstromExponent: number;\n /** Rayleigh wavelength exponent; defaults to 4. */\n rayleighExponent?: number;\n}\n\nexport interface CalculateAtmosphericHazeInput {\n /** Line-of-sight distance through the homogeneous haze, metres (>= 0). */\n pathLengthM: number;\n /** Wavelength, nm (same basis as the extinction data). */\n wavelengthNm: number;\n /** Scene (object) radiance at zero distance, any linear radiance unit (>= 0). */\n sceneRadiance: number;\n /** Horizon/airlight radiance in the same unit (>= 0). */\n airlightRadiance: number;\n extinction: AtmosphericExtinctionModel;\n}\n\nexport interface AtmosphericHaze {\n wavelengthNm: number;\n pathLengthM: number;\n rayleighExtinctionPerMeter: number;\n aerosolExtinctionPerMeter: number;\n extinctionPerMeter: number;\n opticalDepth: number;\n /** Direct transmittance t = exp(-beta d). */\n transmittance: number;\n /** L0 t. */\n attenuatedSceneRadiance: number;\n /** L_air (1 - t). */\n airlightContribution: number;\n /** L0 t + L_air (1 - t), in the input radiance unit. */\n hazedRadiance: number;\n /** Apparent contrast against the horizon divided by the intrinsic contrast: (L - L_air)/(L0 - L_air) = t. */\n contrastTransmittance: number;\n}\n\nexport interface CalculateExtinctionFromVisibilityInput {\n /** Meteorological visibility, metres. */\n visibilityM: number;\n /** Contrast threshold epsilon in (0, 1); Koschmieder 0.02 by default, WMO MOR uses 0.05. */\n contrastThreshold?: number;\n}\n\nfunction requireNonNegativeFinite(name: string, value: unknown): number {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < 0) {\n throw new InvalidScientificInputError(`${name} must be finite and non-negative.`);\n }\n return value;\n}\n\nfunction requireFinite(name: string, value: unknown): number {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n throw new InvalidScientificInputError(`${name} must be finite.`);\n }\n return value;\n}\n\n/**\n * Koschmieder haze at one wavelength: attenuated scene radiance plus airlight, with Rayleigh and\n * Angstrom-law aerosol extinction.\n */\nexport function calculateAtmosphericHaze(\n input: CalculateAtmosphericHazeInput\n): CalculationResult<AtmosphericHaze> {\n requireInputKeys(input, \"calculateAtmosphericHaze\", [\"pathLengthM\", \"wavelengthNm\", \"sceneRadiance\", \"airlightRadiance\", \"extinction\"]);\n const d = requireNonNegativeFinite(\"pathLengthM\", input.pathLengthM);\n requirePositiveFinite(\"wavelengthNm\", input.wavelengthNm);\n const l0 = requireNonNegativeFinite(\"sceneRadiance\", input.sceneRadiance);\n const lAir = requireNonNegativeFinite(\"airlightRadiance\", input.airlightRadiance);\n const model = input.extinction;\n if (typeof model !== \"object\" || model === null) {\n throw new InvalidConfigurationError(\"extinction must be an object.\");\n }\n // A misspelt optional field (for example rayleighExponet) must not silently fall back to the default.\n rejectUnknownFields(model, [\"referenceWavelengthNm\", \"rayleighExtinctionPerMeter\", \"aerosolExtinctionPerMeter\", \"angstromExponent\", \"rayleighExponent\"], \"extinction\");\n requirePositiveFinite(\"extinction.referenceWavelengthNm\", model.referenceWavelengthNm);\n const betaR = requireNonNegativeFinite(\n \"extinction.rayleighExtinctionPerMeter\",\n model.rayleighExtinctionPerMeter\n );\n const betaA = requireNonNegativeFinite(\n \"extinction.aerosolExtinctionPerMeter\",\n model.aerosolExtinctionPerMeter\n );\n const alpha = requireFinite(\"extinction.angstromExponent\", model.angstromExponent);\n const rayleighExponent =\n model.rayleighExponent === undefined\n ? 4\n : requireFinite(\"extinction.rayleighExponent\", model.rayleighExponent);\n if (alpha < -1 || alpha > 4 || rayleighExponent < 3.5 || rayleighExponent > 4.5) {\n throw new InvalidScientificInputError(\n \"extinction.angstromExponent must lie in [-1, 4] and rayleighExponent in [3.5, 4.5].\"\n );\n }\n\n const ratio = input.wavelengthNm / model.referenceWavelengthNm;\n const rayleigh = betaR * ratio ** -rayleighExponent;\n const aerosol = betaA * ratio ** -alpha;\n const beta = rayleigh + aerosol;\n const opticalDepth = beta * d;\n const transmittance = Math.exp(-opticalDepth);\n const attenuated = l0 * transmittance;\n // -expm1(-tau) = 1 - t without cancellation for thin haze.\n const airlight = lAir * -Math.expm1(-opticalDepth);\n return approximationResult(\n {\n wavelengthNm: input.wavelengthNm,\n pathLengthM: d,\n rayleighExtinctionPerMeter: rayleigh,\n aerosolExtinctionPerMeter: aerosol,\n extinctionPerMeter: beta,\n opticalDepth,\n transmittance,\n attenuatedSceneRadiance: attenuated,\n airlightContribution: airlight,\n hazedRadiance: attenuated + airlight,\n contrastTransmittance: transmittance\n },\n \"koschmieder-homogeneous-haze\",\n \"1.0.0\",\n [\n \"Koschmieder model: L = L0 exp(-beta d) + L_air (1 - exp(-beta d)) along one homogeneous horizontal line of sight\",\n `Extinction = Rayleigh (lambda^-${rayleighExponent}) + aerosol Angstrom law (lambda^-${alpha}) scaled from caller reference coefficients`,\n \"Airlight radiance is caller-supplied; sky gradients, multiple-scattering angular structure, absorption bands and slant-path density changes are not modeled\",\n \"Radiance unit is whatever the caller supplies; the model is linear in it\"\n ]\n );\n}\n\n/**\n * Extinction coefficient from meteorological visibility with Koschmieder's relation\n * beta = -ln(epsilon) / V.\n */\nexport function calculateExtinctionFromVisibility(\n input: CalculateExtinctionFromVisibilityInput\n): CalculationResult<{ extinctionPerMeter: number; contrastThreshold: number }> {\n requireInputKeys(input, \"calculateExtinctionFromVisibility\", [\"visibilityM\", \"contrastThreshold\"]);\n requirePositiveFinite(\"visibilityM\", input.visibilityM);\n const epsilon = input.contrastThreshold ?? 0.02;\n if (typeof epsilon !== \"number\" || !(epsilon > 0) || !(epsilon < 1)) {\n throw new InvalidScientificInputError(\"contrastThreshold must lie in (0, 1).\");\n }\n return calculatedResult(\n {\n extinctionPerMeter: -Math.log(epsilon) / input.visibilityM,\n contrastThreshold: epsilon\n },\n \"koschmieder-visibility-extinction\",\n \"1.0.0\",\n [\n \"Koschmieder relation for a black target against the horizon in a homogeneous atmosphere\",\n \"Threshold 0.02 is Koschmieder's; WMO meteorological optical range uses 0.05\"\n ]\n );\n}\n"]}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generic Brown-Conrady lens distortion: radial (k1, k2, k3) plus tangential/decentering (p1, p2)
|
|
3
|
+
* terms on normalized image-plane coordinates (x, y) = point / normalizationRadiusMm, r^2 = x^2 + y^2:
|
|
4
|
+
* x_d = x (1 + k1 r^2 + k2 r^4 + k3 r^6) + 2 p1 x y + p2 (r^2 + 2 x^2)
|
|
5
|
+
* y_d = y (1 + k1 r^2 + k2 r^4 + k3 r^6) + p1 (r^2 + 2 y^2) + 2 p2 x y
|
|
6
|
+
* In vector form the tangential term is r^2 P + 2 (P . u) u with P = (p2, p1), so (p1, p2) rotate as
|
|
7
|
+
* a vector with the image.
|
|
8
|
+
*
|
|
9
|
+
* Sources: Conrady 1919 (MNRAS 79:384, decentred lens systems); Brown 1966
|
|
10
|
+
* (Photogrammetric Engineering 32:444, "Decentering distortion of lenses"); Brown 1971 (Photogramm.
|
|
11
|
+
* Eng. 37:855, close-range camera calibration). The coefficient layout follows the widely used
|
|
12
|
+
* Brown-Conrady convention (for example Heikkila & Silven 1997, CVPR). The coefficient names match
|
|
13
|
+
* that convention, but the values only mean something together with the declared normalization
|
|
14
|
+
* radius.
|
|
15
|
+
*
|
|
16
|
+
* Validity checks (matching the radial-distortion validator):
|
|
17
|
+
* - The radial part must be strictly monotonic over the envelope (the valid radius range).
|
|
18
|
+
* - The Jacobian determinant must stay positive at a dense, fixed polar grid of samples over the
|
|
19
|
+
* envelope disk.
|
|
20
|
+
* - The mapped envelope boundary must have strictly increasing polar angle, so it is a simple
|
|
21
|
+
* star-shaped curve.
|
|
22
|
+
* A smooth, locally invertible map of a closed disk that is one-to-one on its boundary is one-to-one
|
|
23
|
+
* everywhere. So these conditions make the inverse single-valued. Note that the Jacobian and boundary
|
|
24
|
+
* conditions are checked at samples, not proven between them.
|
|
25
|
+
*
|
|
26
|
+
* The inverse uses damped Newton iteration, starting from the radial-only inverse.
|
|
27
|
+
* @see docs/PHYSICS_FOUNDATION.md for the equations, units, coordinate conventions, known blockers
|
|
28
|
+
* and support limits.
|
|
29
|
+
*/
|
|
30
|
+
import { type CalculationResult } from "../core/calculation-result.js";
|
|
31
|
+
import { type LensFieldPointMm, type ValidatedRadialProfile } from "./radial-distortion.js";
|
|
32
|
+
export interface BrownConradyDistortionCoefficients {
|
|
33
|
+
/** Radial r^2 coefficient. */
|
|
34
|
+
k1: number;
|
|
35
|
+
/** Radial r^4 coefficient. */
|
|
36
|
+
k2: number;
|
|
37
|
+
/** Radial r^6 coefficient. */
|
|
38
|
+
k3: number;
|
|
39
|
+
/** Tangential (decentering) coefficient p1 (couples to y; see module equation). */
|
|
40
|
+
p1: number;
|
|
41
|
+
/** Tangential (decentering) coefficient p2 (couples to x; see module equation). */
|
|
42
|
+
p2: number;
|
|
43
|
+
}
|
|
44
|
+
export interface BrownConradyDistortionProfile {
|
|
45
|
+
/** Physical image-plane radius used to normalize field position, in mm. */
|
|
46
|
+
normalizationRadiusMm: number;
|
|
47
|
+
/** Maximum undistorted normalized radius of the operating envelope. */
|
|
48
|
+
maximumNormalizedRadius: number;
|
|
49
|
+
coefficients: BrownConradyDistortionCoefficients;
|
|
50
|
+
}
|
|
51
|
+
export interface CalculateBrownConradyDistortionMappingInput {
|
|
52
|
+
/** Ideal/undistorted image-plane point, in mm. */
|
|
53
|
+
imagePointMm: LensFieldPointMm;
|
|
54
|
+
profile: BrownConradyDistortionProfile;
|
|
55
|
+
}
|
|
56
|
+
export interface CalculateInverseBrownConradyDistortionMappingInput {
|
|
57
|
+
/** Distorted image-plane point to map back to ideal coordinates, in mm. */
|
|
58
|
+
distortedImagePointMm: LensFieldPointMm;
|
|
59
|
+
profile: BrownConradyDistortionProfile;
|
|
60
|
+
}
|
|
61
|
+
export interface BrownConradyDistortionMapping {
|
|
62
|
+
direction: "undistorted-to-distorted";
|
|
63
|
+
sourceImagePointMm: LensFieldPointMm;
|
|
64
|
+
mappedImagePointMm: LensFieldPointMm;
|
|
65
|
+
sourceNormalizedRadius: number;
|
|
66
|
+
/** Determinant of d(mapped)/d(source) at the source point (dimensionless area scale). */
|
|
67
|
+
jacobianDeterminant: number;
|
|
68
|
+
deltaMm: {
|
|
69
|
+
x: number;
|
|
70
|
+
y: number;
|
|
71
|
+
distance: number;
|
|
72
|
+
};
|
|
73
|
+
profileMinimumJacobianDeterminant: number;
|
|
74
|
+
}
|
|
75
|
+
export interface InverseBrownConradyDistortionMapping {
|
|
76
|
+
direction: "distorted-to-undistorted";
|
|
77
|
+
distortedImagePointMm: LensFieldPointMm;
|
|
78
|
+
sourceImagePointMm: LensFieldPointMm;
|
|
79
|
+
sourceNormalizedRadius: number;
|
|
80
|
+
jacobianDeterminantAtSource: number;
|
|
81
|
+
newtonIterations: number;
|
|
82
|
+
/** Forward-mapping residual of the solved source point, in mm. */
|
|
83
|
+
residualMm: number;
|
|
84
|
+
deltaMm: {
|
|
85
|
+
x: number;
|
|
86
|
+
y: number;
|
|
87
|
+
distance: number;
|
|
88
|
+
};
|
|
89
|
+
profileMinimumJacobianDeterminant: number;
|
|
90
|
+
}
|
|
91
|
+
interface ValidatedBrownConradyProfile {
|
|
92
|
+
radial: ValidatedRadialProfile;
|
|
93
|
+
coefficients: BrownConradyDistortionCoefficients;
|
|
94
|
+
minimumJacobianDeterminant: number;
|
|
95
|
+
}
|
|
96
|
+
/** @internal Opaque validated profile for repeated in-package evaluation. */
|
|
97
|
+
export type ValidatedBrownConradyDistortionProfile = ValidatedBrownConradyProfile;
|
|
98
|
+
/** @internal Validates one profile for repeated evaluation (geometric mapping, ray queries). */
|
|
99
|
+
export declare function validateBrownConradyDistortionProfile(profile: BrownConradyDistortionProfile): ValidatedBrownConradyDistortionProfile;
|
|
100
|
+
/** @internal Forward map in mm with its Jacobian d(distorted)/d(ideal), row-major. */
|
|
101
|
+
export declare function brownConradyForwardValue(profile: ValidatedBrownConradyDistortionProfile, point: LensFieldPointMm): {
|
|
102
|
+
mappedImagePointMm: LensFieldPointMm;
|
|
103
|
+
jacobian: readonly [number, number, number, number];
|
|
104
|
+
};
|
|
105
|
+
/** @internal Inverse map in mm (distorted to ideal). */
|
|
106
|
+
export declare function brownConradyInverseValue(profile: ValidatedBrownConradyDistortionProfile, point: LensFieldPointMm): LensFieldPointMm;
|
|
107
|
+
/** Applies the Brown-Conrady forward mapping to one ideal image-plane point. */
|
|
108
|
+
export declare function calculateBrownConradyDistortionMapping(input: CalculateBrownConradyDistortionMappingInput): CalculationResult<BrownConradyDistortionMapping>;
|
|
109
|
+
/**
|
|
110
|
+
* Inverse-maps one distorted image-plane point to its ideal source point, for destination-to-source
|
|
111
|
+
* resampling. Damped Newton iteration starts from the radial-only inverse. The solution must lie
|
|
112
|
+
* inside the declared envelope and must reproduce the distorted point within a relative tolerance of
|
|
113
|
+
* 1e-12.
|
|
114
|
+
*/
|
|
115
|
+
export declare function calculateInverseBrownConradyDistortionMapping(input: CalculateInverseBrownConradyDistortionMappingInput): CalculationResult<InverseBrownConradyDistortionMapping>;
|
|
116
|
+
export {};
|