illumination op• Data kinds: कोई नहीं → table (केवल arguments से तय होने वाला op — यह कोई image या data input नहीं लेता)
• Call: import fullseye as fs; fs.ledger.light_source(kind='ring', radius_mm=60.0, height_mm=100.0, n=24, tilt_deg=None, length_mm=100.0, intensity=1.0, cos_exponent=1.0, position=None, emitters=None, directions=None) (implementation को सीधे call करना हो तो import illumdesign; illumdesign.light_source(kind='ring', radius_mm=60.0, height_mm=100.0, n=24, tilt_deg=None, length_mm=100.0, intensity=1.0, cos_exponent=1.0, position=None, emitters=None, directions=None), registry से लेना हो तो opsoptics.get("light_source"))
मानक machine-vision light family के लिए emitter set (table)।
> नीचे का विस्तृत विवरण मूल text में है — सारांश और headings का अनुवाद हो चुका है।
*kind*:
• "point" — one emitter at *position* (default (0, 0, height_mm)) pointing straight down.
• "ring" — *n* emitters on a circle of *radius_mm* at *height_mm*, each tilted toward the axis by *tilt_deg* (default: aimed at the origin, so the ring's elevation angle is atan(height/radius); low height/radius = dark field, high = bright field).
• "bar" — *n* emitters along a line of *length_mm* parallel to x at y = radius_mm, z = height_mm, aimed at the origin line.
• "dome" — *n* emitters spread over a hemisphere of *radius_mm* (Fibonacci lattice, zenith angles 20°–85°), each pointing at the centre:
the diffuse, shadow-free illumination of a dome light.
• "coaxial" — a disc of *n* emitters of radius *radius_mm* at *height_mm* pointing down: the diffuse area source a beam splitter folds onto the viewing axis. Put it at the camera height with a radius of at least twice the part size, so that every point of a flat glossy part sees the source in its mirror direction (a *small* source at the camera gives one bright spot, not a field-wide glare). The dict carries an area record so defect_contrast takes the specular glare from the disc's uniform radiance L = n I0/(π r²) by a mirror-hit test instead of a point sum that cannot resolve a narrow lobe.
• "backlight" — *n* × *n* emitters on a square of side 2·radius_mm at z = −height_mm pointing up: the part is seen in silhouette.
• "custom" — *emitters* (N,3) and *directions* (N,3) given explicitly.
*intensity* is the radiant intensity of one emitter on its axis (arbitrary units), *cos_exponent* the Lambertian order of its angular distribution (1 = ideal Lambertian LED; ~2–4 for a lensed LED with a narrower beam).
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 में दिए गए हैं।
• illumination_design_demo — py -3.11 examples/illumination_design_demo.py
• virtual_machine_vision — py -3.11 examples/virtual_machine_vision.py
table को input के रूप में लेते हैं)abcd_matrix · wavefront_stats · sfr_from_edge · paraxial_trace · seidel_coefficients · spot_stats · tolerance_analysis · wavefront_from_opd
illumination)irradiance_map · illumination_uniformity · defect_contrast · lighting_sweep · illumination_design
*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.