Source code for eradiate.scenes.illumination._astro_object
from __future__ import annotations
import attrs
import numpy as np
import pint
import pinttr
from ._directional import DirectionalIllumination
from ...attrs import documented, parse_docs
from ...frame import angles_to_direction
from ...units import unit_context_config as ucc
from ...units import unit_registry as ureg
from ...validators import is_positive
[docs]
@parse_docs
@attrs.define(eq=False, slots=False)
class AstroObjectIllumination(DirectionalIllumination):
"""
Astronomical Object Illumination scene element [``astro_object``].
This illumination represents the light coming from a distant astronomical
object (*e.g.* the Sun). The astronomical object uniformly illuminates a
portion of the sky such that it appears to the observer as a circle. Its
size is defined by the apparent diameter of the circle, expressed in
degrees.
Warnings
--------
This is an experimental feature. At the moment, using the
:class:`.DirectionalIllumination` is recommended.
Notes
-----
Contrary to the directional illuminant, the astronomical object is not a
delta emitter, *i.e.* it has a non-zero apparent size. Light rays cast by
this illuminant are, from the point of view of the observer, encompassed
in a cone, while they are parallel in the case of the directional
illumination.
"""
angular_diameter: pint.Quantity = documented(
pinttr.field(
default=0.5358 * ureg.deg,
validator=[is_positive, pinttr.validators.has_compatible_units],
units=ucc.deferred("angle"),
),
doc="Apparent diameter of the celestial body as seen from the point. "
"The default value is an average of the apparent diameter of the "
"Sun as seen from Earth.\n"
"\n"
"Unit-enabled field (default units: ucc['angle']).",
type="quantity",
init_type="quantity or float",
default="0.5358 deg",
)
@property
def direction(self) -> np.ndarray:
"""
Illumination direction as an array of shape (3,), pointing inwards.
"""
return angles_to_direction(
[self.zenith.m_as(ureg.rad), self.azimuth.m_as(ureg.rad)],
azimuth_convention=self.azimuth_convention,
flip=False,
).reshape((3,))
@property
def template(self) -> dict:
# Inherit docstring
return {
"type": "astroobject",
"to_world": self._to_world,
"angular_diameter": self.angular_diameter.m_as("degree"),
}