cplx_winding_number — MATH complex op

• Data kinds: cpoints → measurement

• Call: import fullseye as fs; fs.ledger.cplx_winding_number(z, w=0.0) (implementation को सीधे call करना हो तो import mathops; mathops.cplx_winding_number(z, w=0.0), registry से लेना हो तो opsmath.get("cplx_winding_number"))

उपयोग

किसी point के चारों ओर closed contour का winding number (turning number)।

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

How many times the polygon z (closing segment implicit) travels counter-clockwise around *w*: +1 for a simple positively-oriented loop containing it, -1 clockwise, 0 outside, ±k for a k-fold loop. Computed as the sum of the principal-value argument increments of z_k - w divided by 2*pi and rounded — for a *polygon* that sum is an exact multiple of 2*pi, so the result is an exact integer, not an estimate (the rounding merely removes ~1e-14 of accumulated float error).

Honest limitation — the count can alias low, and no local check can stop it: this is the winding number of the polygon *through the samples*, which equals that of the underlying curve only if the sampling resolves it. A segment that turns the ray to *w* by >= pi is ambiguous (which side did it pass?) and raises. Below that there is no contradiction to detect:

z**5 sampled on a 4-point circle turns exactly pi/2 per step and counts 1 instead of 5 (measured). From pi/2 up, a RuntimeWarning says so (WIND_ALIAS_WARN); the only real remedy is the classical one — refine until the count stops changing.

Raises ValueError: *w* coincides with a vertex or lies on a segment (the winding number is undefined on the contour), a segment subtends >= pi as seen from *w* (undersampled — refine the contour), fewer than 3 points, degenerate contour, non-finite/masked input.

HALCON: no operator (test_region_point answers the related but weaker inside/outside question for regions).

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

mathops के सभी ops गणना से पहले input की जाँच करते हैं (कुछ भी चुपचाप पास नहीं होता):

• complex input से ValueError — float64 में ज़बरदस्ती बदलने पर imaginary part चुपचाप छूट जाता है (numpy केवल ComplexWarning देता है और "सही दिखने वाला पर गलत" real number लौटाता है)। .real/.imag/abs() स्पष्ट रूप से लिखें, या complex data संभालने वाले complexops का उपयोग करें।

• masked array (masked elements वाला) से ValueError — mask हटाकर नीचे के raw values इस्तेमाल करने वाला implicit conversion अस्वीकार है। भरना है या हटाना है, यह स्पष्ट रूप से बताएँ।

• हर input पर NaN/Inf से ValueError (गिनती बताकर अस्वीकार — क्योंकि यह पूरे परिणाम में फैल जाता है)।

• Shape सख़्त है: 1-D और 2-D को implicit रूप से promote या broadcast नहीं किया जाता (vector slot में matrix या matrix slot में vector देने पर ValueError; reshape स्पष्ट रूप से करें)।

• Size की सीमा: matrix लेने वाले ops और stat_histogram के bins, mathops.MAX_ELEMENTS (2^26 ≈ 6.7 करोड़ elements) से अधिक होने पर ValueError देते हैं।

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

• math_metrology 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 करते हैं)

• math_complex — py -3.11 examples/math_complex.py

• poc_complex_plane_fields — py -3.11 examples/poc_complex_plane_fields.py

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

—

इसी category के (complex)

cplx_contour_circle · cplx_poly_eval · cplx_contour_integral · cplx_cauchy_value · cplx_argument_principle · cplx_laurent_coeffs · cplx_joukowski · cplx_mobius


*Provenance: mathops.py — MATH operator registry. यह per-op note tools/opdocs.py md से अपने-आप generate होता है (हाथ से edit न करें)।*

© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.