Source code for pyetsimul.visualization.transforms
"""Coordinate transformation utilities for visualization.
Provides functions for transforming local surface coordinates to world coordinates for 3D plotting.
"""
import numpy as np
from ..types import TransformationMatrix
def _assert_shape(x: np.ndarray, shape: list[int | None]) -> None:
"""ex: assert_shape(conv_input_array, [8, 3, None, None])"""
if len(x.shape) != len(shape):
raise ValueError(f"Expected shape of length {len(shape)}, got {x.shape}")
for actual, expected in zip(x.shape, shape, strict=False):
if isinstance(expected, int) and actual != expected:
raise ValueError(f"Expected dimension {expected} but got {actual} for shape {x.shape}")
[docs]
def transform_surface(
x_local: np.ndarray, y_local: np.ndarray, z_local: np.ndarray, trans_matrix: TransformationMatrix
) -> tuple[np.ndarray, np.ndarray, np.ndarray]:
"""Transform surface coordinates to world coordinates for 3D visualization.
Applies homogeneous transformation to local surface coordinates for plotting.
Args:
x_local: Local surface X coordinates
y_local: Local surface Y coordinates
z_local: Local surface Z coordinates
trans_matrix: 4x4 transformation matrix
Returns:
Tuple of transformed (x, y, z) world coordinates
"""
_assert_shape(y_local, x_local.shape)
_assert_shape(z_local, x_local.shape)
ones = np.ones_like(x_local)
local_coords = np.stack([x_local, y_local, z_local, ones], axis=0)
world_coords = np.einsum("ij,j...->i...", trans_matrix, local_coords)
return world_coords[0], world_coords[1], world_coords[2]