form_factor_polygons — OPTICS radiosity op

• Data kinds: points × points → measurement

• Call: import fullseye as fs; fs.ledger.form_factor_polygons(poly_i, poly_j, n_quad=8, occluders=None) (implementation को सीधे call करना हो तो import radiosity3d; radiosity3d.form_factor_polygons(poly_i, poly_j, n_quad=8, occluders=None), registry से लेना हो तो opsoptics.get("form_factor_polygons"))

उपयोग

3-D में दो समतल उत्तल बहुभुजों (त्रिभुज या चतुर्भुज) के बीच view factor F_ij, संख्यात्मक रूप से।

> नीचे का विस्तृत विवरण मूल text में है — सारांश और headings का अनुवाद हो चुका है।

F_ij = (1/A_i) ∫_{A_i} F_{dA→A_j} dA: the inner factor from a point to the polygon j is Lambert's closed contour sum (1/2π) Σ_k n·Γ_k (exact, no quadrature), the outer integral over i an n_quad × n_quad Gauss–Legendre rule on the (bilinearly mapped) polygon. A polygon that straddles the receiver's plane is integrated by points with the cosine clipped at 0 instead. Each polygon is (3, 3) or (4, 3) vertices (x, y, z) in order around its edge; the sides that face each other count (the vertex order does not matter).

*occluders* is None (nothing in between — true inside a convex cavity) or an optscene scene (list of scene_* dicts): each quadrature point is then tested with one ray to the centre of j.

Gates: Howell's C-11 (0.199825) and C-14 (0.200044) to the quadrature accuracy, reciprocity A_i F_ij = A_j F_ji.

Returns F_ij (measurement).

Raises ValueError: an empty polygon, or one that is not (3|4, 3), non-finite, degenerate, non-planar or non-convex; *n_quad* not an integer in [1, 64]; *occluders* that are not optscene primitives.

पूरी family का input contract (fail-closed)

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।

उपयोग की विस्तृत guide

• optics_imaging family guide

संदर्भ (sample data, साहित्य)

• 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 में दिए गए हैं।

चलाए जा सकने वाले उदाहरण (verified samples जो सच में यह op call करते हैं)

• poc_pocket_interreflection — py -3.11 examples/poc_pocket_interreflection.py

वे अगले ops जिनसे type जुड़ता है (measurement को input के रूप में लेते हैं)

—

इसी category के (radiosity)

form_factor_parallel_rects · form_factor_perpendicular_rects · radiosity_patches · 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.