normals_to_angles — REPRCONV direction op

• Data kinds: normals → pairs

• Call: import fullseye as fs; fs.ledger.normals_to_angles(normals) (to call the implementation directly, import reprconv; reprconv.normals_to_angles(normals); from the registry, opsreprconv.get("normals_to_angles"))

Usage

Normals (N,3) → azimuth/elevation pairs (N,2) [deg]. The exit from normals.

az = atan2(c1, c0) is the azimuth in the axis0-axis1 plane, el = asin(c2/|v|) is the elevation from axis 2. It is defined with "axis 0/1/2", not x/y/z, because this repo has both point clouds in (z,y,x) order and point clouds in (x,y,z) order -- written with names, the meaning would change depending on which convention the passed array follows.

Invertible: round-tripping with angles_to_normals returns the direction exactly (measured max|Δ| = 6.1e-16, selftest measures it every time). Only the length does not come back -- a normal is a direction, so a non-unit vector becomes a unit vector after the round trip.

Args:

normals: (N, 3) real array. Zero vectors are rejected (the azimuth cannot be defined).

Returns:

(N, 2) float64. Column 0 = azimuth (-180, 180], column 1 = elevation [-90, 90].

Raises:

ValueError: shape is not (N,3) / non-finite / contains a vector of length 0.

References (sample data, literature)

• Sample-data catalog (download URLs / licences) — 2-D uses skimage.data (BSD/public domain) plus synthetic images; 3-D lists download URLs for real data sources (Stanford, PDS, …).

• Operator provenance and references — the sources of the research/methods this op family came from.

• The canonical algorithm (author, year) and its uses are named in the family usage guide above.

Runnable examples (verified samples that actually call this op)

• poc_tacscalib_sphere_lut — py -3.11 examples/poc_tacscalib_sphere_lut.py

• representation_roundtrip — py -3.11 examples/representation_roundtrip.py

Ops the type connects to (they accept pairs as input)

angles_to_normals · shape_index_to_curvature · pairs_to_signal · pairs_to_image2d · pairs_to_table · polar_to_cscalar

Same category (direction)

angles_to_normals · normals_to_egi


*Provenance: reprconv.py — REPRCONV operator registry. This per-op note is generated by tools/opdocs.py md (do not hand-edit).*

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