illumination op• Data kinds: कोई नहीं → table (केवल arguments से तय होने वाला op — यह कोई image या data input नहीं लेता)
• Call: import fullseye as fs; fs.ledger.coaxial_illumination(reflectance=0.5, absorptance=0.0, back_reflectance=0.04, plate_thickness_mm=1.0, plate_index=1.52, panel_mm=60.0, panel_distance_mm=60.0, camera_distance_mm=200.0, field_mm=20.0, part='mirror', telecentric=False, panel_radiance=None, shape=(65, 65), n_panel=None) (implementation को सीधे call करना हो तो import illumdesign; illumdesign.coaxial_illumination(reflectance=0.5, absorptance=0.0, back_reflectance=0.04, plate_thickness_mm=1.0, plate_index=1.52, panel_mm=60.0, panel_distance_mm=60.0, camera_distance_mm=200.0, field_mm=20.0, part='mirror', telecentric=False, panel_radiance=None, shape=(65, 65), n_panel=None), registry से लेना हो तो opsoptics.get("coaxial_illumination"))
coaxial (half-mirror) lighting: round-trip T*R का हिसाब और camera द्वारा देखी गई image (table)।
> नीचे का विस्तृत विवरण मूल text में है — सारांश और headings का अनुवाद हो चुका है।
The panel (square, side *panel_mm*, unfolded distance *panel_distance_mm* from the part through the 45-degree half mirror) lights the part by one reflection (R); the camera (pinhole at *camera_distance_mm*, or telecentric) looks through the mirror (T = 1 - R - A).
Budget: round_trip = R T (1/4 for the default lossless 50/50 mirror; splitter_reflectance / splitter_transmittance carry R and T under the names the optscene coaxial light reads), optimum_reflectance = (1 - A) / 2, max_round_trip = (1 - A)^2 / 4 (0.25 for a lossless mirror), ghost_ratio = T^2 r_b / R (the back-surface reflection of the plate, relative to the front reflection, on the illumination leg) and ghost_offset_mm = 2 t tan(theta_r) cos 45 deg (its lateral shift; sin theta_r = sin 45 / n).
Image (camera view, *shape* pixels over a square field of half-width *field_mm*):
• part="mirror": a specular part shows the panel itself, so the image is R T L(panel point) with the panel point x (1 + h_panel / h_camera) (x for a telecentric lens) — the panel's non-uniformity is imaged one to one (like critical illumination) and the field goes dark beyond vignetting_edge_mm = (panel / 2) / (1 + h_panel / h_camera).
• part="matte": a Lambertian part (albedo 1) returns R T E / pi, with E the irradiance of the panel (numerical sum over an *n_panel* x *n_panel* grid; the closed form for a uniform rectangle is matte_centre_closed). *n_panel* = None uses 32.
*panel_radiance*: None = uniform 1, or a 2-D map laid over the panel square. Returns also image, uniformity (illumination_uniformity of the central 80 %; None when T = 0 and the image is dark by the budget, not by the geometry), panel_scale (1 + h_panel / h_camera).
Raises ValueError: R + A > 1, R = 0, a panel farther than the camera, unknown part.
optics के सभी ops गणना से पहले input की जाँच करते हैं (कुछ भी चुपचाप पास नहीं होता):
• Unit argument के नाम में ही लिखी होती है — _mm / _um / _deg / _mrad। mm और µm की गड़बड़ी crash नहीं करती, बल्कि "सही दिखने वाला पर गलत उत्तर" देती है, इसलिए नाम से इसे रोका जाता है। मान के आकार से unit का अनुमान बिल्कुल नहीं लगाया जाता।
• String से ValueError — float('50') सफल हो जाता है, इसलिए बिना parse किया config value length के रूप में निकल जाता (मापा गया: thin_lens('50', '200') सही दिखने वाला 66.667 mm लौटा रहा था)। bool को भी True == 1 वाले implicit promotion के रूप में अस्वीकार किया जाता है।
• complex / masked array से ValueError (केवल real-valued slots; imaginary part को चुपचाप छोड़ना या mask हटाना अस्वीकार)। हर input पर NaN/Inf से ValueError।
• शून्य से भाग और उससे जुड़े मामलों को नाम लेकर अस्वीकार किया जाता है: focal length 0, radius of curvature 0, refractive index <= 0, पूरी तरह opaque aperture (सब 0, इसलिए normalisation 0/0), ऐसा PSF जिसका योग <= 0 हो, S0 = 0 वाला Stokes vector, और front focal point पर रखा object (image अनंत पर)।
• केवल 2 ops non-finite value लौटाते हैं, और वह भी contract के रूप में लिखा हुआ: depth_of_field hyperfocal distance से आगे far_mm = inf (hyperfocal distance की परिभाषा यही है) और gaussian_beam waist पर wavefront_radius_mm = inf (plane wavefront की radius of curvature)। दोनों साथ में एक finite साथी (far_is_infinite / curvature_per_mm) भी लौटाते हैं। इसके अलावा कोई भी चुपचाप आया NaN/Inf अंदर ही पकड़ा जाता है और ValueError देता है — "float64 overflow हुआ" और "उत्तर अनंत है" अलग-अलग दावे हैं, इसलिए पहले को दूसरे का चेहरा पहनाकर नहीं लौटाया जाता।
• Size की सीमा: generate होने वाले grid के लिए optics.MAX_GRID (4096), दिए गए field/PSF/aperture के लिए optics.MAX_FIELD_ELEMENTS (2^24), ABCD element chain के लिए optics.MAX_SYSTEM_ELEMENTS (1024), Zernike के लिए MAX_ZERNIKE_TERMS (512) / MAX_ZERNIKE_ORDER (40) / MAX_ZERNIKE_BASIS (2^25)। छोटे argument से बहुत बड़ा internal allocation होने वाले रास्तों (मापा गया: n_max=40 × 4096² पर 108 GB) को fail-closed ढंग से बंद किया गया है।
• भौतिक रूप से असंभव states भी अस्वीकार: degree of polarisation > 1 वाला Stokes vector, ऋणात्मक transmittance, ऋणात्मक intensity, और n-|m| odd जैसे अमान्य Zernike indices।
• mv_illumination_practice — Lighting व्यवहार में — wavelength, polarisation, drive modes, ambient light, safety
• Sample data catalog (DL URL / license) — 2-D के लिए skimage.data (BSD/public) + synthetic, 3-D के लिए real data sources (Stanford/PDS आदि) के DL URL।
• Operators का स्रोत और संदर्भ — इस op family के मूल research/methods के स्रोत।
• Algorithm का मानक स्रोत (लेखक, वर्ष) और उपयोग ऊपर की family usage guide में दिए गए हैं।
• poc_spectrometer_illumination — py -3.11 examples/poc_spectrometer_illumination.py
table को input के रूप में लेते हैं)abcd_matrix · wavefront_stats · sfr_from_edge · paraxial_trace · seidel_coefficients · spot_stats · tolerance_analysis · wavefront_from_opd
illumination)light_source · irradiance_map · illumination_uniformity · defect_contrast · lighting_sweep · illumination_design · solid_angle_light · solid_angle_boundaries
*Provenance: illumdesign.py — OPTICS operator registry. यह per-op note tools/opdocs.py md से अपने-आप generate होता है (हाथ से edit न करें)।*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.