radiosity op• Data kinds: कोई नहीं → table (केवल arguments से तय होने वाला op — यह कोई image या data input नहीं लेता)
• Call: import fullseye as fs; fs.ledger.radiosity_patches(polygons=None, albedo=None, scene=None, patch_mm=2.0, outer_mm=None) (implementation को सीधे call करना हो तो import radiosity3d; radiosity3d.radiosity_patches(polygons=None, albedo=None, scene=None, patch_mm=2.0, outer_mm=None), registry से लेना हो तो opsoptics.get("radiosity_patches"))
बहुभुजों या optscene दृश्य से समतल radiosity patches का समूह (rad_patches तालिका) बनाता है।
> नीचे का विस्तृत विवरण मूल text में है — सारांश और headings का अनुवाद हो चुका है।
Either *polygons* — (N, 3|4, 3) flat convex triangles or quads, one patch each, vertices in order around the edge, normal = right-hand rule (the side that emits) — with *albedo* a scalar, (N,) or (N, 3) (RGB) in [0, 1] (None = 0.5); or *scene* — an optscene scene (scene_box, scene_difference of a box minus a box, finite scene_plane; an infinite plane only with albedo 0) whose Lambertian faces are cut into rectangles no larger than *patch_mm* (cut also at every other face's plane, so no patch straddles another face; *outer_mm*, when given, is the size used on every face that is not the inside of a pocket — the outside of a part rarely exchanges light with anything, so it can be coarse) no patch straddles another face). Faces in contact with another solid are dropped. Albedo then comes from each primitive's material (passing *albedo* too is refused — two sources for one number).
Returns a dict (table) with kind = "rad_patches", polygons (N, 4, 3), normals (N, 3), areas (N,), centers (N, 3), albedo (N, 3), labels (N,) (scene index, or -1), regions (N,) ("outer" / "cavity" / "plane" / "polygon") and occluders (the scene, or None).
Raises ValueError: both or neither of *polygons* / *scene* (an empty polygon array or scene included); *albedo* given with *scene*; a polygon that is degenerate, non-planar or non-convex; an albedo outside [0, 1] or of the wrong shape; a scene primitive that is not supported (sphere, cylinder, nested difference, reflective infinite plane) or not Lambertian; more than 6000 patches.
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 में दिए गए हैं।
• poc_pocket_interreflection — py -3.11 examples/poc_pocket_interreflection.py
table को input के रूप में लेते हैं)abcd_matrix · wavefront_stats · sfr_from_edge · paraxial_trace · seidel_coefficients · spot_stats · tolerance_analysis · wavefront_from_opd
radiosity)form_factor_parallel_rects · form_factor_perpendicular_rects · form_factor_polygons · form_factor_matrix · radiosity_progressive_3d · render_optscene_gi
*Provenance: radiosity3d.py — OPTICS operator registry. यह per-op note tools/opdocs.py md से अपने-आप generate होता है (हाथ से edit न करें)।*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.