"""Target 3D position variations."""
import math
from collections.abc import Iterable
from ..types import Position3D
from .core import TargetVariation
from .grid_base import RegularGrid
[docs]
class TargetPositionVariation(TargetVariation):
"""Varies gaze target positions in space using grid generation."""
[docs]
def __init__(
self, grid_center: Position3D, dx: list[float], dy: list[float], dz: list[float], grid_size: list[int]
) -> None:
"""Initialize target position variation.
Args:
grid_center: Center position for grid
dx: X-axis displacement ranges
dy: Y-axis displacement ranges
dz: Z-axis displacement ranges
grid_size: Number of steps in each dimension
"""
super().__init__("target_position")
self.grid = RegularGrid(center=grid_center, dx=dx, dy=dy, dz=dz, grid_size=grid_size)
[docs]
def describe(self) -> str:
"""Return human-readable description of target position variation."""
total_targets = len(self)
return f"gaze targets across {total_targets} screen positions"
def __len__(self) -> int:
"""Return the total number of target positions."""
return math.prod(self.grid.grid_size)
[docs]
def generate_values(self) -> Iterable[Position3D]:
"""Generate all target positions using the grid system."""
yield from self.grid.generate_positions()