watervision opimage2d → tableimport fullseye as fs; fs.ledger.caustic_irradiance(height_field, extent_m, depth_m, light_dir, n_water=None, size=None, method='photon', ray_density=4, periodic=True, max_gain=20.0) -> 'dict' (実装を直接呼ぶなら import watervision; watervision.caustic_irradiance(height_field, extent_m, depth_m, light_dir, n_water=None, size=None, method='photon', ray_density=4, periodic=True, max_gain=20.0) -> 'dict'、台帳から引くなら opsoptics.get("caustic_irradiance"))The irradiance a collimated light leaves on a flat floor below a wavy water surface -> dict.
height_field (ny, nx) is the surface height (m) of a periodic patch of extent_m metres (a length, or (Lx, Ly)); it is
treated as band limited (the Nyquist row and column are dropped) and sampled finer by an integer ray_density (rays per cell and axis; the default 4 is for the photon
method, the wavefront method triangulates its landing points and is usually run with 1 or 2) with a
Fourier interpolation that also gives the exact slopes. depth_m is the depth of the floor below the mean level
(it must lie below every wave crest). light_dir is the direction the light travels, a 3-vector with a downward z or
(zenith_deg, azimuth_deg). n_water defaults to the material-table index at 0.55 um. size is the
floor grid (ny, nx) (default: that of the height field).
method="photon": one ray per fine cell leaves the surface, is refracted by the vector form of Snell’s law with the
normal of the local slope, carries the power the beam puts on that cell, E0 (d.(-grad h, 1)) dx dy, times the unpolarised
Fresnel transmittance, lands on the floor and is binned by bilinear splatting (the weights add up exactly, so the energy is
conserved). method="wavefront": the map surface to floor, (x, y) -> (x, y) + s t_xy, has the Jacobian J
(spectral derivatives of the periodic displacement) and the irradiance at a landing point is the carried power over
|det J|; it is interpolated linearly onto the floor grid. Where det J falls below 1 / max_gain or turns negative the
map folds (a caustic: the geometric gain is unbounded and several sheets overlap), the wavefront result is inf there
and fold_mask flags the pixels (dilated by one pixel). The unit is the irradiance of the beam, measured on the horizontal
floor, so a flat surface gives exactly cos(theta_i) T(theta_i) everywhere (the refracted beam is narrower by
cos(theta_i) / cos(theta_t) and meets the floor at cos(theta_t)).
The table has irradiance (ny, nx), fold_mask, x_m / y_m (floor nodes), incident_flux (the power of the beam through the
patch, summed over the rays), incident_flux_analytic (cos(theta_i) Lx Ly), transmitted_flux (after Fresnel),
floor_flux (the integral of the irradiance, photon only), lost_flux_fraction (photons that left a non-periodic patch),
mean_transmittance, flat_irradiance (cos(theta_i) T), theta_i_deg, theta_t_deg, n_water and
n_rays. Non-finite heights, a floor above a crest, a light not pointing down and a patch too large for the ray cap
are refused.
optics の全 op は入力を検証してから計算する(黙って通さない):
_mm / _um / _deg / _mrad。mm と µm の取り違えは crash ではなく「もっともらしく間違った答え」なので、名前で防ぐ。大きさから単位を推測する処理は一切しない。ValueError — float('50') は成功してしまうため、未パースの設定値が長さとして通り抜ける(実測: thin_lens('50', '200') がもっともらしい 66.667 mm を返していた)。bool も True == 1 の暗黙昇格として拒否。ValueError(実数枠のみ。虚部の無言切り捨て・マスク剥がしを拒否)。NaN/Inf は全入力で ValueError。depth_of_field の過焦点距離以遠の far_mm = inf(それが過焦点距離の定義)と gaussian_beam のウエストでの wavefront_radius_mm = inf(平面波面の曲率半径)。どちらも有限の相棒(far_is_infinite / curvature_per_mm)を併せて返す。それ以外の無言 NaN/Inf は内部で検出して ValueError —「float64 が溢れた」と「答えが無限大」は別の主張なので、後者の顔で前者を返さない。optics.MAX_GRID(4096)、供給された場/PSF/開口は optics.MAX_FIELD_ELEMENTS(2^24)、ABCD 素子列は optics.MAX_SYSTEM_ELEMENTS(1024)、Zernike は MAX_ZERNIKE_TERMS(512)/ MAX_ZERNIKE_ORDER(40)/ MAX_ZERNIKE_BASIS(2^25)。小さな引数から巨大な内部確保が起きる経路(実測: n_max=40 × 4096² で 108 GB)を fail-closed で塞ぐ。| 物理的に不可能な状態も拒否: 偏光度 > 1 の Stokes ベクトル、負の透過率、負の強度、n- | m | が奇数などの不正な Zernike 添字。 |
py -3.11 examples/poc_water_inspection_images.pytable を入力に取れる)abcd_matrix · wavefront_stats · sfr_from_edge · paraxial_trace · seidel_coefficients · spot_stats · tolerance_analysis · wavefront_from_opd
watervision)bottle_image · fill_level_from_image · wet_surface_appearance · wet_dry_inspection_pair · underwater_inspection_image · caustic_floor_segmentation
Provenance: watervision.py — OPTICS operator registry. この per-op ノートは tools/opdocs.py md が自動生成(手編集しない)。
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.