geometric op• Data kinds: कोई नहीं → table (केवल arguments से तय होने वाला op — यह कोई image या data input नहीं लेता)
• Call: import fullseye as fs; fs.ledger.thin_lens(focal_mm=50.0, object_mm=200.0) (implementation को सीधे call करना हो तो import optics; optics.thin_lens(focal_mm=50.0, object_mm=200.0), registry से लेना हो तो opsoptics.get("thin_lens"))
Gaussian thin-lens imaging: image कहाँ बनती है और कितनी बड़ी है।
> नीचे का विस्तृत विवरण मूल text में है — सारांश और headings का अनुवाद हो चुका है।
Solves 1/f = 1/s_o + 1/s_i in the real-is-positive convention:
*object_mm* (s_o) is the lens-to-object distance and must be positive; the returned image_mm (s_i) is positive for a real image on the far side of the lens and negative for a virtual image on the object side (which is what a diverging lens, focal_mm < 0, always produces).
Returns a dict: image_mm · magnification m = -s_i/s_o (*negative = inverted*, the normal case for a real image; |m| < 1 is a demagnified, i.e. machine-vision, geometry) · object_mm and focal_mm echoed back so a table of results is self-describing · working_distance_mm = s_o + s_i for a real image, the object-to-sensor span a machine builder actually has to fit.
Ground truth it reproduces exactly (verified in tests/test_optics.py):
f = 50, s_o = 200 gives s_i = 200/3 = 66.6667 and m = -1/3; at s_o = 2f the image is at 2f with m = -1 (the 1:1 conjugate); the reciprocal identity 1/f - 1/s_o - 1/s_i is 0 to machine precision over the whole tested range.
Raises ValueError: focal_mm == 0 (not a lens), non-positive or non-finite *object_mm*, and — explicitly, instead of returning inf — object_mm == focal_mm, where the object sits at the front focal point and images at infinity (a collimator, not an imaging conjugate).
Paraxial and thin: no aberration, no principal-plane separation. HALCON has no equivalent (its camera model starts after the lens, at the projection).
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।
• 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 में दिए गए हैं।
• lightfield_depth — py -3.11 examples/lightfield_depth.py
• optics_imaging — py -3.11 examples/optics_imaging.py
table को input के रूप में लेते हैं)abcd_matrix · wavefront_stats · sfr_from_edge · paraxial_trace · seidel_coefficients · spot_stats · tolerance_analysis · wavefront_from_opd
geometric)abcd_matrix · abcd_trace · depth_of_field · relative_illumination
*Provenance: optics.py — OPTICS operator registry. यह per-op note tools/opdocs.py md से अपने-आप generate होता है (हाथ से edit न करें)।*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.